使用foldr返回列表的后缀

时间:2012-10-17 23:59:49

标签: sml smlnj fold

我需要返回列表的后缀,似乎无法解决它。

给定列表[1,2,3],该函数应返回[[3],[2,3],[1,2,3]]。我们应该使用foldr和辅助函数来解决。

3 个答案:

答案 0 :(得分:1)

这是@ 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 Library中的rev功能。否则,实现这样的功能应该很容易。

答案 1 :(得分:1)

这个怎么样:

[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]

答案 2 :(得分:0)

Haskell将是:

suffixes = reverse . foldr f [] where
  f y [] = [[y]]
  f y (yss@(ys:_)) = (y:ys) : yss  

我不知道SML,但解决方案应该类似