gpt4 book ai didi

list - Haskell [x] 和 x 符号 - 作为模式示例

转载 作者:行者123 更新时间:2023-12-02 05:33:35 25 4
gpt4 key购买 nike

我正在阅读 Learn you a Haskell for great good 和第 40 页 - as-patterns。

我将示例稍微更改为:

firstLetter :: String -> String
firstLetter "" = "Empty string, oops"
firstLetter all@(x:xs) = "The first letter of " ++ all ++ " is " ++ [x] ++ " otherbit " ++ xs

然后可以这样使用:

*Main> firstLetter "Qwerty"
"The first letter of Qwerty is Q otherbit werty"

但我对 [x] 和 x 之间的区别以及为什么我必须在上面的示例中使用 [x] 感到困惑。

例如,如果我改成

firstLetter :: String -> String
firstLetter "" = "Empty string, oops"
firstLetter all@(x:xs) = "The first letter of " ++ all ++ " is " ++ x ++ " otherbit " ++ xs

我得到错误:

Couldn't match expected type `[Char]' with actual type `Char'
In the first argument of `(++)', namely `x'
In the second argument of `(++)', namely `x ++ " otherbit " ++ xs'
In the second argument of `(++)', namely
`" is " ++ x ++ " otherbit " ++ xs'

我可以使用xs 打印"werty" 但必须使用[x] 打印"Q"。这是为什么?

[x] 是什么意思?

(x:xs)中,:只是分隔了每个元素,所以x是第一个元素。为什么我无法使用 x 进行打印?

还有xs是什么类型的?值列表?那么这是否意味着 x 是一个元素并且 xs 必须是列表类型?

最佳答案

++ 用于连接列表:

(++) :: [a] -> [a] -> [a]  

[x] 是一个列表,x 不是一个列表。

firstLetter (x:xs) 是模式匹配的一个例子。

(:) :: a -> [a] -> [a]  

此运算符在列表之前添加元素。
因此 x 的类型是元素,xs 的类型是元素列表。在 Haskell 中,将后缀“s”添加到列表的名称中很常见。

关于list - Haskell [x] 和 x 符号 - 作为模式示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15782801/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com