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

Why is my Haskell function argument required to be of type Bool?

我在 Haskell 中有一个函数定义如下:

f2 x y = if x then x else y

当试图确定 y 的类型时,我假设它可以是任何有效的 Haskell 类型,因为评估 if 部分不需要它。但是,使用

检查类型签名
:type f2

产量

f2 :: Bool -> Bool -> Bool

在这种情况下,为什么 y 参数需要是 Bool 类型?

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

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

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

由于测试中也用到了x,所以一定是Bool。那么一定是 y.