键入签名错误Haskell

时间:2017-09-07 23:15:30

标签: haskell

这可能是一个愚蠢的问题,但我想更好地理解类型签名以及为什么我在运行代码时遇到以下错误。代码如下。

area :: Double d => d -> d
area x = x^2 * 3.14

我得到的错误如下。

Double is applied to too many type arguments
In the type signature for `area': area :: Double d => d -> d

1 个答案:

答案 0 :(得分:5)

您想要的签名是Double -> Double

Double d => d -> d说“我接受任何类型d的值,并返回相同类型的值,前提是d有一个名为{{1}的类型类的实例}”。编译器正在寻找一个名为Double类型类,但没有这样的类型类;相反,它会找到一个名为Double类型,给出错误。

使用某些扩展程序(例如DoubleTypeFamilies),您可以写这样的类型:

GADTs

这表示“我获取任何类型(d ~ Double) => d -> d 的值,并返回相同类型的值,前提是d等于d”。这只是说Double的迂回方式;如果你编写这种类型的函数,编译器实际上会将它扩展为Double -> Double

Double -> Double

从技术上讲,您遇到的错误是种类错误 - 种类是“类型类型”,用于检查诸如为类型提供正确数量的类型参数之类的事情。因为您为> :set -XTypeFamilies > let f :: (d ~ Double) => d -> d; f x = x > :t f f :: Double -> Double 提供了一个类型参数,所以GHC推断它应该是类似DoubleEq的类型类,它将1种类型作为参数(种类Ord),但是* -> Constraint是一个不带参数的普通类型(kind Double)。你可以看到各种常见的类型和GHCi中的类型类使用*:kind命令来更好地理解它们:

:k