如标题所述,我不明白f^:proposition^:_ y
为什么是while循环。我实际上已经使用过几次,但是我不知道它是如何工作的。我知道^:
重复了函数,但是我对该语句的双重使用感到困惑。
我也无法理解f^:proposition^:a: y
为什么起作用。这与上一个相同,但返回所有迭代的值,而不是像上面的那样仅返回最后一个。a:
是一个空盒子,我知道它与^:
一起使用具有特殊含义,但是即使在查看字典后,我仍然听不懂。
谢谢。
最佳答案
f^:proposition^:_
不是while循环。当proposition
返回1
或0
时,这几乎是一个while循环。当proposition
返回其他结果时,这是一种奇怪的while循环。
让我们以一个简单的单子(monad)案例为例。
f =: +: NB. Double
v =: 20 > ] NB. y less than 20
(f^:v^:_) 0 NB. steady case
0
(f^:v^:_) 1 NB. (f^:1) y, until (v y) = 0
32
(f^:v^:_) 2
32
(f^:v^:_) 5
20
(f^:v^:_) 21 NB. (f^:0) y
21
这就是发生的情况:每当
v y
是1
时,就会执行(f^:1) y
。 (f^:1) y
的结果是新的y
,依此类推。y
连续两次保持不变→输出y
并停止。 v y
是0
→输出y
并停止。 所以这里的
f^:v^:_
就像double while less than 20 (or until the result doesn't change)
让我们看看当
v
返回2
/0
而不是1
/0
时会发生什么。 v =: 2 * 20 > ]
(f^:v^:_) 0 NB. steady state
0
(f^:v^:_) 1 NB. (f^:2) 1 = 4 -> (f^:2) 4 = 16 -> (f^:2) 16 = 64 [ -> (f^:0) 64 ]
64
(f^:v^:_) 2 NB. (f^:2) 2 = 8 -> (f^:2) 8 = 32 [ -> (f^:0) 32 ]
32
(f^:v^:_) 5 NB. (f^:2) 5 = 20 [ -> (f^:0) 20 ]
20
(f^:v^:_) 21 NB. [ (f^:0) 21 ]
21
通过使用
v
,您可以拥有多种“奇怪”循环。 (它甚至可以返回负整数,以使用f
的反函数)。关于while-loop - J:为什么 `f^:proposition^:_ y`会停顿一会儿循环?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18682404/