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
这样的数字文字方面有点特别。有一些文字被粗略地当作是WAREInteger
s,即任意精度的整数类型,然后使用typeclassNum
的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
这样的数字文字方面有点特别。有一些文字被粗略地当作是WAREInteger
s,即任意精度的整数类型,然后使用typeclassNum
的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
应该只用于数字类型,而字符串不是数字