我的理解是,它为函数找到一个值,这样它就可以输出你给它的东西。问题是,它将始终选择未定义(或无限循环,在 haskell 中,未定义和无限循环是相同的)或其中包含最多未定义的任何内容。例如,使用 id,
λ <*Main Data.Function>: id undefined
*** Exception: Prelude.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
,您没有无限循环或未定义。