我是Haskell的新手,正在阅读Arrow tutorial。
我无法理解Haskell如何评估此loop
函数:
newtype Circuit a b = Circuit { unCircuit :: a -> (Circuit a b, b) }
instance ArrowLoop Circuit where
loop (Circuit cir) = Circuit $ \b ->
let (cir', (c,d)) = cir (b,d) -- line (A)
in (loop cir', c)
在line (A)
,初始化之前使用变量d
。
这怎么可能? GHC是否执行定点计算?
答案 0 :(得分:9)
Haskell的let
和where
绑定是自递归的。您可以通过使用固定点计算来精确地模拟该消除。由于ArrowLoop
模拟了一个折叠自身的函数,因此您需要使用此自递归。
与往常一样,这样的自我递归可能是非终止的,除非可以充分懒惰地进行评估以提高效率。