通过“从第一原理哈斯克尔编程”的工作,我的回答感到迷惑不解以下问题:哈斯克尔返回类型混乱
如果
kessel
类型为(Ord a, Num b) => a -> b -> a
,那么kessel 1 2
类型是一个)
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
!
我不明白什么?
谢谢你的帮助。
我们要求'Num a'以便'1 :: a'有意义。 –
作为一个侧面说明,这个问题真的很糟糕:“正确”的答案很大程度上取决于Haskell类型系统的一些不太有趣的变化,特别是默认和数字字面多态性,并取决于你如何解释这个问题还有单态限制。如果你对'Num b'约束使用了一个不同于'Num'的类(当然还有一个适当的'2'的替代参数),那么正确答案可能就是“这是一个模糊的类型错误”,如果你在文件中写入'foo = kessel 1 2',并向ghci询问它的类型,它会告诉你'foo :: Integer'! –
......而且要明确,通过“这个问题”,我并不是说你要问的问题很糟糕。我认为你在设置你的问题方面做得很好。我在说“来自第一校长的Haskell编程”这个问题令人困惑,并且(在我看来)是一个严重的问题。 –