使用'=>' Haskell上的符号

时间:2017-02-27 16:21:57

标签: haskell syntax

我是haskell的新手,下面有一个工作代码如下。

sum' :: (Num a) => [a] -> a
sum' [] = 0  
sum' (x:xs) = x + sum' xs 

我尝试做的是更具体地说明我的类型。而不是只使用'a'我尝试编写我的代码。

sum' :: (Num a, Num b) => [a] -> b
sum' [] = 0  
sum' (x:xs) = x + sum' xs 

当我这样做时,我得到一个错误。错误如下:无法将预期类型'b'与实际类型'a'匹配       'a'是绑定的刚性类型变量           sum'::(Num a,Num b)=>的类型签名[a] - > b           在baby.hs:2:9       'b'是绑定的刚性类型变量           sum'::(Num a,Num b)=>的类型签名[a] - > b           在baby.hs:2:9

我想我并不真正理解'=>'的含义。这部分让我困惑的是'=>'之前的内容。有时像'(Show a)=>'通常只是类似于我的代码中的类型。请提前帮助谢谢。

2 个答案:

答案 0 :(得分:3)

  

而不是使用' a'只有我尝试编写我的代码。

这不起作用,因为+需要两个相同类型的参数,并返回该类型的结果。

:t (+)
(+) :: Num a => a -> a -> a

由于无法添加两个Integer并返回Double,或添加IntegerDouble,因此也没有将Integer的列表相加并获取Double的方法。

Num a =>表示类型a必须是数字。更准确地说,它要求存在类型类 Num a实例 Num

有关类型类的更多信息,请访问here

答案 1 :(得分:0)

在第一个代码段中,您说“获取a的列表(它是类型类型Num的实例),并返回与该列表中的元素类型相同的内容(该类型在整个类型签名中由a表示。“这就是你想要的。

第二个片段说“获取a的列表(这是类型数Num的一个实例),并返回类型为b的类型。”由于(+)返回与其参数相同的类型,因此您的函数也必须。

第一个代码段中的Num a适用于类型签名中的所有a,因此没有理由将它们拆分为ab