这个简单的类型定义有什么问题? (期待再多一个论点......)

时间:2012-10-15 21:29:03

标签: haskell

basic.hs:

areaCircle :: Floating -> Floating
areaCircle r = pi * r * r

命令:

*Main> :l basic.hs 
[1 of 1] Compiling Main             ( Sheet1.hs, interpreted )

Sheet1.hs:2:15:
    Expecting one more argument to `Floating'
    In the type signature for `areaCircle':
      areaCircle :: Floating -> Floating
Failed, modules loaded: none.

我看到areaCircle :: Floating a => a -> a按预期加载。为什么上述版本不被接受?

2 个答案:

答案 0 :(得分:21)

因为您的版本实际上并未提供类型。 Floating是一个类型类。如果您想允许任何浮动,那么Floating a => a -> a是正确的。否则,您可以尝试Float -> FloatDouble -> Double

只是为了充实它:Floating a => a -> a不仅表示你的函数接受任何Floating类型,而且返回它传递的相同类型。即使您缩小类型,也必须如此。例如,如果不进行其他转换,则无法使用Float -> Double

答案 1 :(得分:13)

Floating不是类型,它是类型。您不能将类型类用作类似的类型。当您在Haskell中说Floating时,您断言以下类型是该类的实例。因此,例如,您可以将代码编写为

areaCircle :: Floating a => a -> a
areaCircle r = pi * r * r

您可以非正式地阅读:对于任何类型a,如果a是类Floating的实例,那么areaCircle可以用作a的函数{1}}至a

你可以认为Floating有点像形容词。它描述了类型。但你试图像名词一样使用它,即。作为一种类型本身。

http://en.wikipedia.org/wiki/Type_class