使用foldr实现inits

时间:2014-06-09 10:52:33

标签: haskell fold

我必须使用map通过foldr实现inits。我得到了大部分内容,但是我在结果列表中缺少空列表元素。

inits :: [a] -> [[a]]
inits = foldr ( \ x y -> [x] : (map (x:) y) ) []

调用时会导致:

  

*蓝图< inits [1,2,3]

     

[[1],[1,2],[1,2,3]]

我现在有点陷入困境,如果有人能指出我错误的大方向,我会很高兴。

提前致谢

解决:

inits :: [a] -> [[a]]
inits = foldr ( \ x y -> [] : (map (x:) y) ) [[]]

2 个答案:

答案 0 :(得分:12)

要用foldr f z写一些东西,你需要考虑两件事:

  1. 基本案例zinits []应该是什么?
  2. 递归步骤f:如果您有一个列表xs == x:xs',您如何从inits xsx构建y == inits xs'

  3. 在纸上完成一些小例子可能有所帮助。 e.g。

    • 递归计算inits [1]:您有x == 1y == inits [] == [[]],需要转到[[], [1]]
    • 递归计算inits [1, 2]:您有x == 1y == inits [2] == [[], [2]],需要转到[[], [1], [1, 2]]

答案 1 :(得分:8)

更紧凑的解决方案:

inits :: [a] -> [[a]]
inits = foldr ((([] :) .) . map . (:)) [[]]