约束多态:变量与函数参数

时间:2017-07-09 12:02:44

标签: haskell

这是一个非常基本的问题。我刚开始使用几种不同的来源研究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)不符合资格。

但我模糊的想法远非完整的解释,我正在寻找一个更好的解释。

1 个答案:

答案 0 :(得分:5)

您应该按以下方式阅读g :: Num a => a -> a类型:

  • g的来电者选择类型a
  • 来电者必须证明a是数字类型
  • 调用者必须提供类型为a
  • 的参数值 然后,
  • g必须使用类型a
  • 的结果值进行回答

因此,x :: Num a => a变为

  • x的用户选择类型a
  • 用户必须证明a是数字类型
  • 然后,
  • x必须使用类型a
  • 的结果值进行回答

因此,x不允许选择a = Doublex的用户可以选择。 想想例如(x :: Int) + 4:这将键入check,pick a=Intx的实现必须是通用的,因此要处理所有数字类型。

顺便提一下,请注意数字文字具有相同的类型42 :: Num a => a,因此我们可以将它们用作DoubleInt或任何其他数字类型。