在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
如何在传递给下一个递归之前将元素附加到列表中。
答案 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)