我有一个关于 GHCi 如何假设整数类型的问题。
我正在阅读 Yes-No 类型的 Learn you a Haskell 课程。
如果您想阅读整个内容,这里有一个链接。 http://learnyouahaskell.com/making-our-own-types-and-typeclasses#a-yes-no-typeclass
简而言之,本章展示了通过定义我自己的类,我可以创建一个适用于多种类型的函数。
本书用一个函数定义了 YesNo 类
yesno :: a -> Bool
并Int
作为 YesNo 类的实例
instance YesNo Int where
yesno 0 = False
yesno _ = True
当我在我的 GHCi 上加载它并输入
yesno 0
它返回错误。我认为这可能是因为 GHCi 无法判断 0 是否意味着Int
或Integer
或Double
或其他类型Num
。实际上,当我输入 yesno (0::Int) 时,它起作用了。
所以只是为了好玩,我Integer
作为YesNo
类的一个实例写了
instance YesNo Integer where
yesno 0 = True
yesno _ = False
(请注意,我翻转了 True 和 False)然后我再次输入
yesno 0
(没有任何类型声明)然后 GHCi 显示True
.
此外,当我输入
yesno $ fromIntegral 0
它返回了True
,这意味着 GHCi 认为的类型fromIntegral 0
是Integer
。
那么,这是否意味着当我在 GHCi 上键入一个整数时,它通常会假定它的值是Integer
而不是?我很困惑,因为:t 0
返回Num a => a