正如标题所说,我不明白为什么f^:proposition^:_ y是一个while循环.我实际上已经使用了几次,但我不明白它是如何工作的.我得到了^:重复函数,但我对它在该语句中的双重用法感到困惑.
我也无法理解为什么f^:proposition^:a: y有效.这与前一个迭代相同,但返回所有迭代中的值,而不是上一个迭代中的最后一个值.
a:是一个空盒子,我得到的具有特殊含义,^:但即使在查看字典后,我无法理解它.
谢谢.
while =: ^:break_clause^:_
Run Code Online (Sandbox Code Playgroud)
这是一个副词,你可以应用于任何代码(相当于循环体)来创建一个while循环.如果您以前没有看过它,那^: 就是功率连接.更具体地说,该短语恰好f^:n y将函数应用于f参数.计数可以是整数或用于产生整数¹的函数.ynny
在上面的副词中,我们看到两次强力连接,一次进入^:break_clause和再次进入^:_ .我们先来讨论后者.这_ 是J的无限符号.因此,从字面上看,^:_ 就是"无限次应用函数"或"永远重新应用".这与while循环函数有关,但如果按字面意思应用它并不是很有用.
因此,相反,^:_ 它的亲属被定义为"将函数应用于其极限",即"继续应用函数直到其输出与其输入匹配".在这种情况下,再次应用该函数将没有任何效果,因为下一次迭代将具有与前一次相同的输入(记住J是函数式语言).因此,再一次应用该功能毫无意义:它已达到极限.
例如:
cos=: 2&o. NB. Cosine function
pi =: 1p1 NB. J's notation for 1*pi^1 analogous to scientific notation 1e1
cos pi
_1
cos cos cos pi
0.857553
cos^:3 pi
0.857553
cos^:10 pi
0.731404
cos^:_ pi NB. Fixed point of cosine
0.739085
Run Code Online (Sandbox Code Playgroud)
在这里,我们继续应用余弦直到答案停止变化:余弦已达到其固定点,更多的应用程序是多余的.我们可以通过显示中间步骤来实现这一点:
cos^:a: pi
3.1415926535897 _1 0.54030230586813 ...73 more... 0.73908513321512 0.73908513321
Run Code Online (Sandbox Code Playgroud)
因此^:_将函数应用于其限制.好的,怎么样^:break_condition?同样,它是相同的概念:在左侧应用函数在右侧的函数指定的次数.在_ (或其函数等效_: )的情况下,输出是"无穷大",在break_condition输出的情况下将是0或1取决于输入(中断条件是布尔值).
所以,如果输入的是"正确的"(即处理完成),那么break_condition将是0,那里loop_body^:break_condition^:_将成为loop_body^:0^:_ .显然,loop_body^:0应用loop_body零次,这没有效果.
"没有效果"是保持输入不变; 换句话说,它将输入复制到输出......但如果输入与输出匹配,则该功能已达到其极限!显然^:_:检测到这个事实并终止.瞧,一阵!!
¹是,包括零和负整数,"整数"应该更恰当地读作"任意整数数组"(因此该函数可以同时应用于多个幂).
f^:proposition^:_不是while 循环。当return或 时,它(几乎)是一个 while 循环。当返回其他结果时,这是某种奇怪的 while 循环。proposition10proposition
让我们看一个简单的单子案例。
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
Run Code Online (Sandbox Code Playgroud)
这就是正在发生的事情:每次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
Run Code Online (Sandbox Code Playgroud)
通过使用 ,您可以拥有多种“奇怪”的循环v。(它甚至可以返回负整数,以使用 的倒数f)。