【发布时间】:2017-02-28 00:36:29
【问题描述】:
我是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) =>' 这样的东西,通常就像在我的代码中一样。请帮助提前谢谢。
【问题讨论】:
-
错误来源是
+的类型签名是Num a => a -> a -> a,即它返回的值与其参数类型相同。但是你希望它产生一个不同于它的参数类型的值(b反对as),这是它根本做不到的。 -
您实际上对您的类型较少具体。
[a] -> b表示你不知道返回的是什么类型;调用者可以指定他们想要的任何东西。使用[a] -> a,您至少是在说返回类型必须与输入列表中存储的类型相同。