我有一个关于 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