Haskell函数可以得到编译错误

use*_*904 0 haskell

我可以在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)

两个函数之间的唯一区别是类型(更改NumFloat)

错误:

`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)

ama*_*loy 6

要扩展注释,Float是一个类型,Num而是一个类型类.那是什么意思?嗯,Float是一个单一的具体类型:浮点数.Num a表示"任何类型a,只要该类型满足成为Num" 的要求.的例子NumInt,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)