我一直难以理解为什么 haskell 表达式会按预期let (x,y) = (y,1) in (x,y)
收敛但导致被抛出。谁能解释一下?(1,1)
fix (\(x,y)-> (y,1))
<<loop>>
问问题
305 次
1 回答
21
默认情况下,let
绑定中使用的最外层模式是惰性的。然而,在 lambda 绑定中使用的模式是严格的,所以模式匹配对元组的强制太早了。您可以通过在其前面加上前缀来显式编写惰性模式匹配~
,使 lambda 模式等效于该let
模式:
ghci> fix (\(~(x, y)) -> (y, 1))
(1,1)
这将模式匹配的实际评估推迟到强制绑定变量之一,而不是在调用函数时,避免循环。
有关更多信息,请参阅有关惰性模式的 Haskell wiki 文章。
于 2018-01-08T03:13:51.487 回答