Floating类型类与Double有何不同?

Cha*_*ana 0 haskell types typeclass

*User> :t sqrt
sqrt :: Floating a => a -> a
Run Code Online (Sandbox Code Playgroud)

我不明白是什么Floating a => a -> a想告诉我的.我的教授告诉我sqrt可以想到sqrt :: Double -> Double.它确实像那样,但Floating a => a -> a意味着什么?

谢谢

pig*_*ker 5

交互式尝试的一个有用的东西ghci:info <something>命令,它有时可以告诉你有用的东西.

> :info Floating
class Fractional a => Floating a where
  pi :: a
  exp :: a -> a
  log :: a -> a
  sqrt :: a -> a
  (**) :: a -> a -> a
  ---------------------------------------- loads more stuff
         -- Defined in ‘GHC.Float’
instance Floating Float -- Defined in ‘GHC.Float’
instance Floating Double -- Defined in ‘GHC.Float’
Run Code Online (Sandbox Code Playgroud)

这是什么意思?Floating是一个类型类.浮点数有多种类型.实际上,有两个是标准的:Float而且Double,在哪里Double给你两倍的精度Float.将aFloating a代表任何类型和业务(包括大名单sqrt)是类的任何实例必须实现一个接口.sqrt接口中的事实Floating意味着它始终只能用于实例Floating.也就是说,对你来说,它的类型就像你说的那样

sqrt :: Floating a => a -> a
Run Code Online (Sandbox Code Playgroud)

=>语法标志着一个约束,在这里Floating a它的左侧.类型说

对于任何类型a的实例Floating,给定输入类型a,输出将具有类型a

您可以通过填写可以满足a约束的任何类型来专门化此类型Floating a,因此以下都是正确的

sqrt :: Float -> Float
sqrt :: Double -> Double
Run Code Online (Sandbox Code Playgroud)

现在,Float并且Double由不同的位模式表示,因此在每种情况下取​​平方根的计算机制是不同的.不必为不同类型的不同版本记住不同的名称是很方便的."约束" Floating a实际上代表接口中所有操作类型的实现的记录(或字典)a.sqrt真正说的是什么类型

给出一个类型a和所有Floating操作的实现字典,我会拿一个a给你一个a

它的工作原理是sqrt从字典中提取相关的实现并在给定的输入上使用它.

因此=>,具有不可见字典输入->的函数类型的信号就像信号具有可见值输入的函数类型一样.当你使用函数时,你没有(实际上,你不能)编写字典:编译器从类型中找出它.当我们写作

sqrt :: Double -> Double
Run Code Online (Sandbox Code Playgroud)

我们的意思是一般sqrt功能不可见地应用于Floating Double字典.