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是否执行定点计算?
Haskell let和where绑定是自递归的.您可以通过使用固定点计算来精确地模拟该消除.由于ArrowLoop模型完全是一个可折叠的函数,因此您需要使用此自递归.
像往常一样,这样的自递归可能是非终止的,除非可以充分懒惰地进行评估以提高效率.