Haskell 返回类型混淆

标签 haskell

在学习“Haskell 编程的第一原理”时,我对以下问题的答案感到困惑:

If the type of kessel is (Ord a, Num b) => a -> b -> a, then the type of kessel 1 2 is

a) Integer
b) Int
c) a
d) (Num a, Ord a) => a
e) Ord a => a
f) Num a => a

答案是 d) - 但我认为答案应该是 e),因为第一个参数 (a) 的类型签名的唯一要求是它是一个 Ord。那么为什么不返回呢?

kessel 'd' 2

有效并且类型为Char - 与Num无关!

我不明白什么?

感谢您的帮助。

最佳答案

1的类型是Num a => a。当您将其作为第一个参数传递给 kessel 时,其类型仅限于 (Num a, Ord a) => a 因为 kessel 需要Ord 作为其第一个参数。由于结果的类型与第一个参数的类型相同,因此您将得到 (Num a, Ord a) => a 作为结果类型。

请注意,这与第二个参数的类型无关。我想第二个论点只是为了让你感到困惑。如果函数是:

kessel :: Ord a => a -> a

那么kessel 1的类型仍然是(Num a, Ord a) => aNum 之所以存在,是因为它是 1 的类型,而不是因为 kessel 的类型。

kessel 'd' 2 的类型是 Char,而不是 Ord Char => Char,因为 Char 已经是实现 Ord 的具体类型,因此没有必要进行限制。

关于Haskell 返回类型混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42589622/

相关文章:

haskell - GHC对Haskell的实现在语义上被破坏了吗?

具有多个参数的 Haskell 和类型类

haskell - 如何使容器包装在堆栈中匹配所需的版本?

haskell - 构建 GHC : configure fails on happy despite successful cabal install

haskell - ghci:如何在文件夹中导入模块

haskell - 在 haskell 中从 stdin 读取的正确方法

list - Haskell 函数将列表中的元素相乘

haskell - 如何以编程方式检索 GHC 包信息?

haskell - 为什么这个 Haskell 程序在优化编译时会泄漏空间?

haskell - 在 Haskell 中使用工作池运行并行 URL 下载