我正在阅读《Learn you a Haskell for great good》和第 40 页 - 作为模式。
我将示例稍微更改为:
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
必须是列表类型?