gpt4 book ai didi

haskell - 如果我对返回值进行硬编码,为什么 Haskell 会给出类型错误?

转载 作者:行者123 更新时间:2023-12-02 12:05:45 24 4
gpt4 key购买 nike

我真的无法解释为什么这是一个类型错误:

foo :: (Eq a) => a -> a
foo _ = 2

谁能解释一下吗?

最佳答案

因为

的类型
foo "bar"
根据您的签名,

应该是字符串,但不是(2 不是字符串)。在您的代码中 foo 是通用的,因此它应该返回与参数类型完全相同的实例。

haskell 类型系统的强大功能为我们提供了额外的信息 - 您对 foo 内的参数所能做的就是检查它与其他东西是否相等,但是我可以想出任何新类型(我们称之为 Baz)并且在其上使用 foo - 您不可能有任何其他 Baz 实例,因此返回 Baz 实例的唯一方法是返回与参数完全相同的实例。

如果你像这样重写 foo :

foo _ = True

它会有一个 foo::a -> Bool 签名,这基本上就是您尝试做的事情,但是数字会使事情变得更加复杂。

一般来说,你的函数有一个签名

foo :: (Num t1) => t -> t1

这意味着它为任何给定参数返回一个 Num 实例。 (这是因为 2 在 haskell 中可以有许多不同的类型,具体取决于您的需要,它可以是 Int 或 Real 或其他类型。)

您应该尝试使用 ghci 中的类型,例如:

:t foo

将为您提供 foo 的推断类型签名。

:t 2

给你(Num t) => t,这意味着2可以是实现Num的任何类型的实例。

关于haskell - 如果我对返回值进行硬编码,为什么 Haskell 会给出类型错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2357994/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com