Haskell让表达式收敛,而使用fix的类似表达式则不会

Ale*_*ond 17 haskell mutual-recursion

我一直难以理解为什么haskell表达式如预期let (x,y) = (y,1) in (x,y)收敛(1,1)fix (\(x,y)-> (y,1))导致<<loop>>被抛出.有谁能解释一下?

Ale*_*ing 21

默认情况下,let绑定中使用的最外层模式是惰性的.但是,lambda绑定中使用的模式是严格的,因此与元组匹配的模式过早地过于强大.您可以通过为其添加前缀来显式编写延迟模式匹配~,使lambda模式等效于let模式:

ghci> fix (\(~(x, y)) -> (y, 1))
(1,1)
Run Code Online (Sandbox Code Playgroud)

这推迟了模式匹配的实际评估,直到强制绑定变量之一,而不是在调用函数时,避免循环.

有关更多信息,请参阅有关延迟模式Haskell wiki文章.