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
按预期加载。为什么上述版本不被接受?
答案 0 :(得分:21)
因为您的版本实际上并未提供类型。 Floating
是一个类型类。如果您想允许任何浮动,那么Floating a => a -> a
是正确的。否则,您可以尝试Float -> Float
或Double -> 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
有点像形容词。它描述了类型。但你试图像名词一样使用它,即。作为一种类型本身。