这不是一个很好的例子,但很容易理解我的问题。假设我想要递归地重新构建一个列表,然后在构建列表后对其应用排序函数。这里有一个实现得到了正确的答案,但不是我想要的方式。
import Data.List
rebuild_and_sort :: [Int] -> [Int]
rebuild_and_sort [] = []
rebuild_and_sort (b:bs) = sort (b:rebuild_and_sort bs)
问题是将对实参列表中的每个元素调用sort。有没有办法使排序只在列表完全重构后调用一次,而不改变所需的参数?
将递归委托给worker函数,并在顶层调用sort
import Data.List(sort)
rbsort :: [Int] -> [Int]
rbsort = sort . go
where go [] = []
go (x:xs) = x: go xs -- here you should be doing something useful