我需要返回一个列表的后缀,似乎无法解决它。
给定一个列表[1,2,3]
,该函数应该返回[[3],[2,3],[1,2,3]]
。我们应该使用 foldr 和一个辅助函数来解决。
这个怎么样:
[1,2,3,4] 将返回 [[1,2,3,4],[2,3,4],[3,4],[4]] :
fun myfun1 l = foldr(fn (a,b)=> if a=nil then [] else a::b@myfun1(tl(l)))[] [l]
[1,2,3,4] 将返回 [[4],[3,4],[2,3,4],[1,2,3,4]] :
fun myfun2 l = foldr(fn (a,b)=> if a=nil then [] else myfun2(tl(l))@a::b)[] [l]
这是@Landei 的 SML 语法解决方案:
fun suffixes xs =
let
fun f (y, []) = [[y]]
| f (y, yss as (ys::_)) = (y::ys)::yss
in
rev (foldr f [] xs)
end
我假设您可以使用SML Basis Libraryrev
中的函数。否则,实现这样的功能应该很容易。
哈斯克尔将是:
suffixes = reverse . foldr f [] where
f y [] = [[y]]
f y (yss@(ys:_)) = (y:ys) : yss
我不知道SML,但解决方案应该是类似的