正如标题所说:对Haskell函数返回单元进行评估有什么保证?有人认为在这种情况下无需运行任何类型的评估,除非存在明确的严格要求,否则编译器可以将所有此类调用替换为立即数()
,在这种情况下,代码可能必须决定是否应返回()
或底部。我已经在GHCi中对此进行了实验,似乎发生了相反的情况,也就是说,似乎正在评估这种功能。一个非常原始的例子是
f :: a -> ()
f _ = undefined
评估f 1
会由于undefined
的存在而引发错误,因此肯定会发生一些评估。但是,尚不清楚评估的深度。有时,它看起来像需要评估返回()
的函数的所有调用一样深入。示例:
g :: [a] -> ()
g [] = ()
g (_:xs) = g xs
如果显示为g (let x = 1:x in x)
,此代码将无限循环。但是然后
f :: a -> ()
f _ = undefined
h :: a -> ()
h _ = ()
可用于显示h (f 1)
返回()
,因此在这种情况下,并非所有单位值的子表达式都被求值。这里的一般规则是什么?
您似乎考虑到类型()
只有一个可能的值()
,因此期望自动返回返回类型()
的值的any