11

基本.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按预期加载。为什么上面的版本不被接受?

4

2 回答 2

24

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

只是为了更充实一点:Floating a => a -> a不仅表示您的函数接受任何Floating类型,而且它返回与传递的相同类型。即使您缩小类型,这也必须是正确的。Float -> Double例如,如果不进行一些额外的转换,您将无法使用

于 2012-10-15T21:34:29.703 回答
15

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

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

您可以非正式地阅读为:对于任何类型a,如果a是类的实例,FloatingareaCircle可以用作 from ato的函数a

你可以把它想象Floating成一个形容词。它描述了类型。但是您试图将其用作名词,即。作为一种类型本身。

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

于 2012-10-15T21:37:51.783 回答