我在 Haskell 中遇到了一些非常不直观的行为,我不确定它是否是 Haskell 中的错误。如果这是预期行为,具体是什么导致无限循环?
import Data.Function (fix)
main=putStrLn$show$fst$
fix (\rec-> (\(a1,a2)->(3,7)) rec)
Run Code Online (Sandbox Code Playgroud)
无限循环,我假设是因为将 rec 模式匹配到 rec (a1,a2) 它评估。但我觉得它不应该需要,因为一切都会匹配。例如,这些都可以正常工作:
fix (\rec-> (\a->(3,7)) rec)
fix (\rec-> (\a->let (a1,a2)=a in (3,7)) rec)
Run Code Online (Sandbox Code Playgroud)
有趣的是这退出错误
fix (\rec-> (\(a1,a2)->(3,7)) undefined)
Run Code Online (Sandbox Code Playgroud)
但是我可以发誓,我遇到这种行为(更复杂)的原始代码在这种情况下实际上会起作用。我可以尝试重新创建它。