我正在使用看起来像这样的模式匹配来编写Haskell函数。
printLine :: [Int] -> [String]
printLine [] = error "Lege lijst levert niets op"
printLine [x] = "+" : replicate x "-"
printLine (x:xs) = ('+' : replicate x "-") : printLine xs
基本案例有效,但GHC给出了一个错误的递归情况,如下所示:
Couldn't match expected type `Char' with actual type `[Char]'
In the second argument of `replicate', namely `"-"'
In the second argument of `(:)', namely `replicate x "-"'
In the first argument of `(:)', namely `('+' : replicate x "-")'
我做错了什么?请记住,我是Haskell的初学者和一般的函数式编程。我希望有人可以帮助我。
答案 0 :(得分:5)
这里有两个错误。首先,请注意单引号和双引号之间的区别:
'+' :: Char
"+" :: String
您希望在最后一行写"+"
而不是'+'
,因为您要将String
附加到String
返回的replicate
列表中}}
其次,最后一行的外:
尝试连接[String]
和[String]
(返回类型printLine
),但其类型为a -> [a] -> [a]
,所以它希望只有一个String
作为它的第一个参数。你想在这里使用(++)
,它连接两个列表。此错误为您提供引用的错误消息。
更正的代码是
printLine :: [Int] -> [String]
printLine [] = error "Lege lijst levert niets op"
printLine [x] = "+" : replicate x "-"
printLine (x:xs) = ("+" : replicate x "-") ++ printLine xs
答案 1 :(得分:4)
在Haskell中,String
只是Char
的列表。
符号'-'
用于单个字符。符号"-"
用于字符串,在本例中是一个由Char
组成的列表。
以下是等效的 - 它们都是由字符'-'
组成的单字符字符串,而不是其他字符。
"-" = ['-']
您还需要使用++
而不是:
来附加字符串。 :
运算符用于在字符串前面添加单个字符。