haskell附加列表和递归

时间:2018-01-10 03:55:33

标签: haskell recursion

在haskell中,我想编写代码,使用递归执行以下操作: 1.比较前2个元素,如果x小于y,则追加y然后递归进行比较,否则追加x并再次进行递归。

我确实喜欢这个:

f:: [Int] -> [Int]
f(x:[]) = [x]
f(x:y:xs)
    | x <= y    = y:f xs
    | otherwise = x:f xs

但是这会在接下来的2个元素之后追加,我想在传递递归之前追加。但是下面没有工作,因为编译器似乎传递了递归的第一个元素,然后是列表因此编译错误。

f(x:[]) = [x]
f(x:y:xs)
    | x <= y    = f y:xs
    | otherwise = f x:xs

如何在传递给下一个递归之前将元素附加到列表中。

1 个答案:

答案 0 :(得分:3)

您似乎遇到的问题是优先问题。

如果您有以下表达式。

f y:xs

编译器将其视为以下内容。

(f y) : xs

您可以在错误消息中看到此操作,其中它实际上将:的第一个争论称为f y,而不仅仅是y

Couldn't match expected type ‘Int’ with actual type ‘[Int]’
In the first argument of ‘(:)’, namely ‘f y’
In the expression: f y : xs

在这种情况下,修复很容易。您只需要特别注意应该应用:操作,并将其结果传递给f的调用。

要做到这一点,你只需要将它包装在括号中。

f (y:xs)