使用foldr实现inits

pow*_*mat 3 haskell fold

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

inits :: [a] -> [[a]]
inits = foldr ( \ x y -> [x] : (map (x:) y) ) []
Run Code Online (Sandbox Code Playgroud)

调用时会导致:

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

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

我现在有点困惑,如果有人能指出我的错误的一般方向,我会很高兴.

提前致谢

解决了:

inits :: [a] -> [[a]]
inits = foldr ( \ x y -> [] : (map (x:) y) ) [[]]
Run Code Online (Sandbox Code Playgroud)

huo*_*uon 12

要与foldr f z你一起写东西需要考虑两件事:

  1. 基本情况z:应该inits []是什么?
  2. 递归步f:如果你有一个清单xs == x:xs',你怎么能构建inits xsxy == inits xs'

在纸上完成一些小例子可能有所帮助.例如

  • 计算inits [1]递归:你有x == 1y == inits [] == [[]]和需要去[[], [1]].
  • 计算inits [1, 2]递归:你有x == 1y == inits [2] == [[], [2]]和需要去[[], [1], [1, 2]].


rpa*_*pax 8

更紧凑的解决方案:

inits :: [a] -> [[a]]
inits = foldr ((([] :) .) . map . (:)) [[]]
Run Code Online (Sandbox Code Playgroud)