Haskell中的惰性前向引用

时间:2014-07-21 03:48:15

标签: haskell lazy-evaluation

我是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是否执行定点计算?

1 个答案:

答案 0 :(得分:9)

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

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