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

812*_*128 8 haskell

basic.hs:

areaCircle :: Floating -> Floating
areaCircle r = pi * r * r
Run Code Online (Sandbox Code Playgroud)

命令:

*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.
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*Dan 21

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

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


sig*_*fpe 13

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

areaCircle :: Floating a => a -> a
areaCircle r = pi * r * r
Run Code Online (Sandbox Code Playgroud)

你可以非正式地为已读:对于任何类型a,如果a是类的实例Floating,然后areaCircle可以作为从功能aa.

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

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