我的理解是,它会为函数找到一个值,以便输出与给定值相同的东西。问题是,它将始终选择未定义(或无限循环,在haskell中,未定义和无限循环是相同的)或其中包含最多未定义的内容。例如,使用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
,没有无限循环或未定义。
fix error
ghci,让自己感觉良好。”