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

Posted

技术标签:

【中文标题】为啥我的 Haskell 函数参数必须是 Bool 类型?【英文标题】:Why is my Haskell function argument required to be of type Bool?为什么我的 Haskell 函数参数必须是 Bool 类型? 【发布时间】:2021-12-31 08:27:47 【问题描述】:

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

f2 x y = if x then x else y

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

检查类型签名
:type f2

产量

f2 :: Bool -> Bool -> Bool

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

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

"不能同时是两种不同的类型。"但是,如果您使用像 Either 这样的 sum 类型,它可以是一种类型或另一种类型。 @KarlBielefeldt 那么它是一种类型,即总和类型。我猜你的意思是,如果代码更改为if x then (Right x) else (Left y)y 可能有不同的类型。

以上是关于为啥我的 Haskell 函数参数必须是 Bool 类型?的主要内容,如果未能解决你的问题,请参考以下文章

Haskell缩进不会排列函数参数

为啥存在量化的 Haskell 中没有“Exist”关键字?

为啥 PDO 将我的 bool(false) 参数转换为 string('')?

Haskell 中的参数化类型

对 Haskell 类型推断感到困惑

为啥我们在haskell中编写函数时需要使用括号?