Haskell 在GHCI中检查时,可能会有不同的类型

Haskell 在GHCI中检查时,可能会有不同的类型,haskell,types,polymorphism,maybe,Haskell,Types,Polymorphism,Maybe,我是哈斯克尔的新手,正在努力自学诀窍,如果这是一个基本问题,请原谅我 如果我打开解释器ghci,为什么会得到以下不同类型: 只有54岁 类型是 只是54::Num a=>可能是a 只有54::可能是Int 类型是 只有54::可能是Int 堆叠 类型是 也许[字符] 我不明白为什么上面的第一个例子会产生一种可能不是Int的类型,因为54可以是任何数字类型。试一下,例如,只需54::可能是浮动的 如果您没有指定任何类型,并且编译器无法选择一个精确的类型,那么它将保留最通用的类型-Num a=>可能

我是哈斯克尔的新手,正在努力自学诀窍,如果这是一个基本问题,请原谅我

如果我打开解释器ghci,为什么会得到以下不同类型:

只有54岁 类型是 只是54::Num a=>可能是a

只有54::可能是Int 类型是 只有54::可能是Int

堆叠 类型是 也许[字符]

我不明白为什么上面的第一个例子会产生一种可能不是Int的类型,因为54可以是任何数字类型。试一下,例如,只需54::可能是浮动的

如果您没有指定任何类型,并且编译器无法选择一个精确的类型,那么它将保留最通用的类型-Num a=>可能意味着它可以是任何形式的类型,也可能是a,只要a是数字


请注意,当您尝试打印它时,GHCi会耍一些把戏并为您选择一个。这称为默认。否则,输入54并按enter键,我们将得到不明确的类型错误:哪个数字类型?,这很不方便。

Haskell数字文本是多态的,因此它们可以用来表示实现Num typeclass的任何类型。因此,任何数值文字的类型实际上都是Num a=>a类型。请尝试Prelude>:i Num并查看其实例列表。除了Int之外,至少还有整数、Float和Double。