在Haskell中对函数->()有什么规则?

问题描述 投票:4回答:1

正如标题所说:对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)返回(),因此在这种情况下,并非所有单位值的子表达式都被求值。这里的一般规则是什么?

haskell lazy-evaluation unit-type
1个回答
3
投票

您似乎考虑到类型()只有一个可能的值(),因此期望自动返回返回类型()的值的any

© www.soinside.com 2019 - 2024. All rights reserved.