为啥我的 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 中没有“Exist”关键字?