f^:proposition^:_
while ループではありません。orを返すときは(ほぼ) while ループです。他の結果を返すときは、奇妙な種類の while ループです。proposition
1
0
proposition
単純なモナドのケースを考えてみましょう。
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
は newy
などです。
y
2回続けて同じだったら→出力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
)。