给定一个向Int添加一个的函数,我们可以看到它的类型签名:
Prelude> addOne :: Int -> Int; addOne x = x + 1
Prelude> :t addOne
addOne :: Int -> Int
签名意味着addOne获取Int并返回Int。很简单。相反,如果我们定义一个函数而不指定一个类型:
Prelude> anotherAddOne x = x + 1
Prelude> :t anotherAddOne
anotherAddOne :: Num a => a -> a
现在我们正在处理Num
而不是Int
这是有意义的,但是阅读Num a => a -> a
的方式是什么?这里=>
和->
有什么区别?
答案 0 :(得分:2)
anotherAddOne :: Num a => a -> a
此处=>
分隔类约束和类型。在此示例中,Num a
是类约束,它由类Num
和类型变量a
组成。完整签名声明对于a
的任何类型Num
,函数anotherAddOne
的类型为a -> a
。