为什么递归情况不起作用?

时间:2013-10-30 13:32:42

标签: haskell pattern-matching

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

2 个答案:

答案 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组成的列表。

以下是等效的 - 它们都是由字符'-'组成的单字符字符串,而不是其他字符。

"-" = ['-']

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