这是一个非常基本的问题。我刚开始使用几种不同的来源研究Haskell。我现在无法解读这些内容。
以下自然会很好地检查。
g :: Num a => a -> a
g x = x + 2
h = g (1.0 :: Double)
当我将其解释如下时,这个约束多态的例子对我来说是完全合理的:只要提供给g
的参数是具有Num
实例的类型,一切都可以。
所以,请考虑以下几点。
x :: Num a => a
如果我将其解释如上,我得到:x
可以获取具有Num
实例的类型的任何值。但是,以下将不类型检查。
x :: Num a => a
x = (1.0 :: Double)
我的问题是:究竟的区别是什么?
我有点得到可能正在发生的事情:在第二个示例中,定义x
以便它将评估为任何Num
,(1.0 :: Double)
不符合资格。
但我模糊的想法远非完整的解释,我正在寻找一个更好的解释。
答案 0 :(得分:5)
您应该按以下方式阅读g :: Num a => a -> a
类型:
g
的来电者选择类型a
a
是数字类型a
g
必须使用类型a
因此,x :: Num a => a
变为
x
的用户选择类型a
a
是数字类型x
必须使用类型a
因此,x
不允许选择a = Double
,x
的用户可以选择。
想想例如(x :: Int) + 4
:这将键入check,pick a=Int
。 x
的实现必须是通用的,因此要处理所有数字类型。
顺便提一下,请注意数字文字具有相同的类型42 :: Num a => a
,因此我们可以将它们用作Double
,Int
或任何其他数字类型。