Haskell中的惰性前向引用

tba*_*tba 3 haskell lazy-evaluation

我是Haskell的新手并阅读了Arrow教程.我无法理解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)
Run Code Online (Sandbox Code Playgroud)

line (A),d初始化之前使用变量.这怎么可能?GHC是否执行定点计算?

J. *_*son 9

Haskell letwhere绑定是自递归的.您可以通过使用固定点计算来精确地模拟该消除.由于ArrowLoop模型完全是一个可折叠的函数,因此您需要使用此自递归.

像往常一样,这样的自递归可能是非终止的,除非可以充分懒惰地进行评估以提高效率.