Haskell 无法理解来自非法元组列表的错误消息

Haskell 无法理解来自非法元组列表的错误消息,haskell,Haskell,我知道这个元组列表不起作用,因为元组的元素不具有相同的类型。但我无法理解错误消息 Prelude> [(1,2),("One",2)] <interactive>:1:3: error: ? Could not deduce (Num [Char]) arising from the literal ‘1’ from the context: Num b bound by the inferred type of it :: Num b =

我知道这个元组列表不起作用,因为元组的元素不具有相同的类型。但我无法理解错误消息

Prelude> [(1,2),("One",2)]

<interactive>:1:3: error:
    ? Could not deduce (Num [Char]) arising from the literal ‘1’
      from the context: Num b
        bound by the inferred type of it :: Num b => [([Char], b)]
        at <interactive>:1:1-17
    ? In the expression: 1
      In the expression: (1, 2)
      In the expression: [(1, 2), ("One", 2)]
前奏曲>[(1,2),(“一”,2)]
:1:3:错误:
? 无法推断由文字“1”产生的(Num[Char])
从上下文:numb
由它的推断类型绑定::Num b=>[([Char],b)]
时间:1:1-17
? 在表达式中:1
在表达式中:(1,2)
在表达式中:[(1,2),(“一”,2)]
这里我认为
Num[Char])
代表“一”。那么“由文字“1”产生”是什么意思?它是否意味着同一位置的各个元素的类型必须是整数?而且,从上下文来看,它意味着什么:Num b?这让我非常困惑。

注意,
[1,“One”]
已经触发了错误

让我们来剖析错误:关键是

   Could not deduce (Num [Char]) arising from the literal ‘1’
这实际上意味着“我需要使用
1::[Char]
,因为这是列表可以键入check的唯一方法。但是,我不知道如何将文本1解释为
[Char]
”(提醒一下,
[Char]
字符串
是完全相同的类型,它们都是字符串文本的类型,例如
“One”

Haskell在处理像
1
这样的数字文字方面有点特别。有一些文字被粗略地当作是WARE
Integer
s,即任意精度的整数类型,然后使用typeclass
Num
fromInteger
方法立即转换成想要的类型

class Num a where
   fromInteger :: Integer -> a
   ...
在标准库中,此类具有所有数值类型的实例。用户可以添加其他实例,例如用户定义的数值类型

一个愚蠢的程序员甚至可以为字符串添加一个实例

instance Num [Char] where
   fromInteger n = "urk!" ++ show n
这个实例是假的,因为它不能合理地定义其他方法,但原则上它可以被使用! 我们可以在GHCi中进行测试:

> [(1,2),("One",2)]
[("urk!1",2),("One",2)]
请注意Haskell是如何按照我们告诉它的方式转换文本的

最后一个警告:不要想在一个严肃的程序中添加这样的实例:)类
Num
应该只用于数字类型,字符串不是数字。

注意
[1,“一”]
已经触发了错误

让我们来剖析错误:关键是

   Could not deduce (Num [Char]) arising from the literal ‘1’
这实际上意味着“我需要使用
1::[Char]
,因为这是列表可以键入check的唯一方法。但是,我不知道如何将文本1解释为
[Char]
”(提醒一下,
[Char]
字符串
是完全相同的类型,它们都是字符串文本的类型,例如
“One”

Haskell在处理像
1
这样的数字文字方面有点特别。有一些文字被粗略地当作是WARE
Integer
s,即任意精度的整数类型,然后使用typeclass
Num
fromInteger
方法立即转换成想要的类型

class Num a where
   fromInteger :: Integer -> a
   ...
在标准库中,此类具有所有数值类型的实例。用户可以添加其他实例,例如用户定义的数值类型

一个愚蠢的程序员甚至可以为字符串添加一个实例

instance Num [Char] where
   fromInteger n = "urk!" ++ show n
这个实例是假的,因为它不能合理地定义其他方法,但原则上它可以被使用! 我们可以在GHCi中进行测试:

> [(1,2),("One",2)]
[("urk!1",2),("One",2)]
请注意Haskell是如何按照我们告诉它的方式转换文本的

最后一个警告:不要想在一个严肃的程序中添加这样的实例:)类
Num
应该只用于数字类型,而字符串不是数字