CMD*_*CMD 6 haskell types functional-programming type-inference
我在 Haskell 中有一个函数,定义如下:
f2 x y = if x then x else y
Run Code Online (Sandbox Code Playgroud)
当尝试确定 的类型时y,我假设它可以是任何有效的 Haskell 类型,因为评估 if 部分不需要它。但是,检查类型签名
:type f2
Run Code Online (Sandbox Code Playgroud)
产量
f2 :: Bool -> Bool -> Bool
Run Code Online (Sandbox Code Playgroud)
为什么在这种情况下y参数需要是类型Bool?
Haskell 值有类型。每个值都有一个类型。一种。它不能同时是两种不同的类型。
因此,由于sx作为ifs 的结果返回,因此整个表达式的类型与s 的类型if ... then ... else ...相同。x
表达式if有类型。因此,它的后续表达式和替代表达式都必须具有相同的类型,因为它们中的任何一个都可以返回,具体取决于测试的值。因此两者必须具有相同的类型。
由于x测试中也使用了 ,因此它必须是Bool. 那么一定是这样y。