【问题标题】: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 类型?

【问题讨论】:

    标签: haskell types functional-programming type-inference


    【解决方案1】:

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

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

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

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

    【讨论】:

    • "不能同时是两种不同的类型。"但是,如果您使用像 Either 这样的 sum 类型,它可以是一种类型或另一种类型。
    • @KarlBielefeldt 那么它是一种类型,即总和类型。我猜你的意思是,如果代码更改为if x then (Right x) else (Left y)y 可能有不同的类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 2020-05-23
    • 2021-06-18
    • 2021-05-12
    • 2019-01-24
    • 2020-06-20
    相关资源
    最近更新 更多