我可以在Haskell中编译以下函数并且它可以工作
addVector :: (Num a) => (a, a) -> (a, a) -> (a, a)
addVector (a, b) (c, d) = (a + c, b + d)
Run Code Online (Sandbox Code Playgroud)
但我得到以下功能的编译错误
addVector3 :: (Float a) => (a, a) -> (a, a) -> (a, a)
addVector3 (a, b) (c, d) = (a + c, d + b)
Run Code Online (Sandbox Code Playgroud)
两个函数之间的唯一区别是类型(更改Num为Float)
错误:
`Float' is applied to too many type arguments
In the type signature for `addVector3':
addVector3 :: Float a => (a, a) -> (a, a) -> (a, a)
Run Code Online (Sandbox Code Playgroud)
要扩展注释,Float是一个类型,Num而是一个类型类.那是什么意思?嗯,Float是一个单一的具体类型:浮点数.Num a表示"任何类型a,只要该类型满足成为Num" 的要求.的例子Num是Int,Float等.
因此,说"这个函数处理任何类型,只要该类型是某种类型的数字"是完全合理的,但根本没有任何意义说"此函数处理任何类型,只要该类型具体Float"((Float a) => (a, a) -> (a, a) -> (a, a)如果有意义,那将是如何解释的).相反,你可以简单地说"这个函数处理Floats",如下所示:
addVector :: (Float, Float) -> (Float, Float) -> (Float, Float)
Run Code Online (Sandbox Code Playgroud)
或者你可以定义一个类型同义词对于这一点,如果你打字的轮胎Float以及,与()一遍又一遍:
type Vector = (Float, Float)
addVector :: Vector -> Vector -> Vector
Run Code Online (Sandbox Code Playgroud)