如标题所述,我不明白f^:proposition^:_ y为什么是while循环。我实际上已经使用过几次,但是我不知道它是如何工作的。我知道^:重复了函数,但是我对该语句的双重使用感到困惑。

我也无法理解f^:proposition^:a: y为什么起作用。这与上一个相同,但返回所有迭代的值,而不是像上面的那样仅返回最后一个。
a:是一个空盒子,我知道它与^:一起使用具有特殊含义,但是即使在查看字典后,我仍然听不懂。

谢谢。

最佳答案

f^:proposition^:_不是while循环。当proposition返回10时,这几乎是一个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 y1时,就会执行(f^:1) y(f^:1) y的结果是新的y,依此类推。
  • 如果y连续两次保持不变→输出y并停止。
  • 如果v y0→输出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/

    10-12 17:38