【问题标题】:Usage of '=>' symbol on Haskell在 Haskell 上使用 '=>' 符号
【发布时间】: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,您至少是在说返回类型必须与输入列表中存储的类型相同。

标签: haskell syntax


【解决方案1】:

我尝试这样编写代码,而不是只使用“a”。

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

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

由于无法添加两个Integers 并返回一个Double,或者添加一个Integer 和一个Double,因此也无法将Integers 的列表相加并得到回Double

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

关于类型类的更多信息可以找到here

【讨论】:

    【解决方案2】:

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

    第二个 sn-p 表示“获取 as 的列表(它是类型类 Num 的实例),并返回 b 类型的东西,一个不同的类型。”由于 (+) 返回与其参数相同的类型,因此您的函数也必须如此。

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

    【讨论】:

      猜你喜欢
      • 2015-11-05
      • 1970-01-01
      • 1970-01-01
      • 2017-10-22
      • 1970-01-01
      • 2012-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多