然而,1 ++ [' ']不起作用,因为它要求1具有[Char]类型。数字文字通过Num类型类重载,因此这意味着编译器查找instance Num [Char]。由于该示例未定义,因此会引发错误。
λ :type 1 ++ [' ']
<interactive>:1:1: error:
• No instance for (Num [Char]) arising from the literal ‘1’
• In the first argument of ‘(++)’, namely ‘1’
In the expression: 1 ++ [' ']
2条答案
按热度按时间olhwl3o21#
原因是
++
运算符的定义表明它有两个参数,都是列表:因为
1
不是一个列表,所以++
运算符对它无效。qvtsj1bj2#
在GHCi中,您可以使用
:info
命令来获取有关如何定义名称的信息。(另外,我通过将:set prompt "λ "
添加到.ghci
配置文件中,将提示符设置为lambda。)String
是[Char]
的类型同义词,[Char]
是Unicode字符列表。单引号表示一个字符,当然您可以列出它们的列表。和双引号组成
String
。由于这两种类型是相等的,因此有多种方式来表示等效值。
由于
String
是一个列表,因此可以对它使用列表操作。然而,
1 ++ [' ']
不起作用,因为它要求1
具有[Char]
类型。数字文字通过Num
类型类重载,因此这意味着编译器查找instance Num [Char]
。由于该示例未定义,因此会引发错误。虽然在技术上可以定义这样一个示例--或者实际上是任何
Applicative
的通用示例--但标准库中没有包含它,因为它很容易被无意中使用;如果它遵循Num
的定律,那么它将以一种可能令人惊讶的方式表现为String
。