有谁能解释一下为什么“安娜”++ [' ']在Haskell中可以工作,而1 ++ [' ']不行?

1tu0hz3e  于 2023-05-29  发布在  其他
关注(0)|答案(2)|浏览(177)

我试图建立一个字符串列表,但我不明白为什么String ++ [' ']工作。如果我尝试处理数字,例如,1 ++ [' '],它不起作用。
我做了:“安娜”++ [‘‘]工作,但1 ++ [‘‘]不。是什么原因呢?

olhwl3o2

olhwl3o21#

原因是++运算符的定义表明它有两个参数,都是列表:

(++) :: [a] -> [a] -> [a]
         ^      ^
         |      |
    first list  |
                |
            second list

因为1不是一个列表,所以++运算符对它无效。

qvtsj1bj

qvtsj1bj2#

在GHCi中,您可以使用:info命令来获取有关如何定义名称的信息。(另外,我通过将:set prompt "λ "添加到.ghci配置文件中,将提示符设置为lambda。)

λ :info String
type String :: Type
type String = [Char]
    -- Defined in ‘GHC.Base’

String[Char]的类型同义词,[Char]是Unicode字符列表。单引号表示一个字符,当然您可以列出它们的列表。

λ :type ' '
' ' :: Char

λ :type [' ']
[' '] :: [Char]

和双引号组成String

λ :type " "
" " :: String

由于这两种类型是相等的,因此有多种方式来表示等效值。

λ " " == [' ']
True

λ "abc" == ['a', 'b', 'c']
True

λ "abc" == 'a' : "bc"
True

λ "abc" == 'a' : 'b' : 'c' : []
True

由于String是一个列表,因此可以对它使用列表操作。

λ :info ++
(++) :: forall a. [a] -> [a] -> [a]     -- Defined in ‘GHC.Base’
infixr 5 ++

λ ("abc" ++ "def") == (['a', 'b', 'c'] ++ ['d', 'e', 'f'])
True

然而,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 ++ [' ']

虽然在技术上可以定义这样一个示例--或者实际上是任何Applicative的通用示例--但标准库中没有包含它,因为它很容易被无意中使用;如果它遵循Num的定律,那么它将以一种可能令人惊讶的方式表现为String

相关问题