私が理解しているのは、関数の値を見つけて、指定したものと同じものを出力するということです。問題は、常に undefined (または、haskell では undefined と無限ループは同じである無限ループ) を選択するか、未定義が最も多いものを選択することです。たとえば、id を使用すると、
λ <*Main Data.Function>: id undefined
*** Exception: Prelude.undefined
ご覧のとおり、 undefined は固定点なので、それfix
を選択します。代わりに (\x->1:x) を実行するとします。
λ <*Main Data.Function>: undefined
*** Exception: Prelude.undefined
λ <*Main Data.Function>: (\x->1:x) undefined
[1*** Exception: Prelude.undefined
したがってfix
、未定義を選択することはできません。無限ループにもう少し接続するため。
λ <*Main Data.Function>: let y=y in y
^CInterrupted.
λ <*Main Data.Function>: (\x->1:x) (let y=y in y)
[1^CInterrupted.
繰り返しますが、わずかな違いです。では固定点は?試してみましょうrepeat 1
。
λ <*Main Data.Function>: repeat 1
[1,1,1,1,1,1, and so on
λ <*Main Data.Function>: (\x->1:x) $ repeat 1
[1,1,1,1,1,1, and so on
同じです!これが唯一の定点なので、fix
そこに落ち着く必要があります。申し訳ありませんfix
が、無限ループや未定義はありません。