为什么我的 Haskell 函数参数必须是 Bool 类型?

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

Wil*_*ess 7

Haskell 值有类型。每个值都有一个类型。一种。它不能同时是两种不同的类型。

因此,由于sx作为ifs 的结果返回,因此整个表达式的类型与s 的类型if ... then ... else ...相同。x

表达式if有类型。因此,它的后续表达式和替代表达式都必须具有相同的类型,因为它们中的任何一个都可以返回,具体取决于测试的值。因此两者必须具有相同的类型。

由于x测试中也使用了 ,因此它必须是Bool. 那么一定是这样y

  • @KarlBielefeldt 那么它是一种类型,即总和类型。我猜你的意思是,如果代码更改为“if x then (Right x) else (Left y)”,“y”可能具有不同的类型。 (2认同)