我是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)=>'通常只是类似于我的代码中的类型。请提前帮助谢谢。
答案 0 :(得分:3)
而不是使用' a'只有我尝试编写我的代码。
这不起作用,因为+
需要两个相同类型的参数,并返回该类型的结果。
:t (+)
(+) :: Num a => a -> a -> a
由于无法添加两个Integer
并返回Double
,或添加Integer
和Double
,因此也没有将Integer
的列表相加并获取Double
的方法。
Num a =>
表示类型a
必须是数字。更准确地说,它要求存在类型类 Num a
的实例 Num
。
有关类型类的更多信息,请访问here
答案 1 :(得分:0)
在第一个代码段中,您说“获取a
的列表(它是类型类型Num的实例),并返回与该列表中的元素类型相同的内容(该类型在整个类型签名中由a
表示。“这就是你想要的。
第二个片段说“获取a
的列表(这是类型数Num的一个实例),并返回类型为b
的类型。”由于(+)返回与其参数相同的类型,因此您的函数也必须。
第一个代码段中的Num a
适用于类型签名中的所有a
,因此没有理由将它们拆分为a
和b
。