键入签名错误 哈斯克尔



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

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

您想要的签名是Double -> Double

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

使用某些扩展名(例如TypeFamiliesGADTs),您可以像这样编写此类型:

(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

从技术上讲,您遇到的错误是一种类型的错误 - 种类是"类型类型",用于检查诸如为类型提供正确数量的类型参数之类的事情。因为你给Double一个类型参数,GHC推断它应该是一个像EqOrd这样的类型类,它接受1个类型作为参数(种类* -> Constraint),但Double是一个不带参数的普通类型(种类*)。您可以使用:kind:k命令查看 GHCi 中常见类型和类型类的种类,以更好地了解它们:

> :k Double
Double :: *
> :k Maybe
Maybe :: * -> *
> :k Maybe Double
Maybe Double :: *
> :k Eq
Eq :: * -> Constraint

相关内容

  • 没有找到相关文章

最新更新