2

我正在使用看起来像这样的模式匹配编写一个 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 和函数式编程的初学者。我希望有人可以帮助我。

4

2 回答 2

5

这里有两个错误。首先,注意单引号和双引号的区别:

'+' :: Char
"+" :: String

您想写"+"而不是写'+'在最后一行,因为您想将 a 附加到由 .返回String的 s 列表中。Stringreplicate

其次,:最后一行的外部尝试连接[String][String](返回类型printLine),但它的类型是a -> [a] -> [a],所以它只期望 aString作为它的第一个参数。您想在(++)此处使用,它连接两个列表。此错误为您提供引用的错误消息。

更正后的代码是

printLine :: [Int] -> [String]
printLine []     = error "Lege lijst levert niets op"
printLine [x]    = "+" : replicate x "-"
printLine (x:xs) = ("+" : replicate x "-") ++ printLine xs
于 2013-10-30T13:42:26.320 回答
4

在 Haskell 中, aString只是Char.

该符号'-'用于单个字符。该表示法"-"用于字符串,在这种情况下是一个由一个组成的列表Char

以下是等价的——它们都是由字符组成的单字符串'-',没有其他字符。

"-" = ['-']

您还需要使用++而不是:附加字符串。运算符用于将:单个字符添加到字符串的前面。

于 2013-10-30T13:43:00.787 回答