我必须使用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) ) [[]]
答案 0 :(得分:12)
要用foldr f z
写一些东西,你需要考虑两件事:
z
:inits []
应该是什么?f
:如果您有一个列表xs == x:xs'
,您如何从inits xs
和x
构建y == inits xs'
?在纸上完成一些小例子可能有所帮助。 e.g。
inits [1]
:您有x == 1
和y == inits [] == [[]]
,需要转到[[], [1]]
。inits [1, 2]
:您有x == 1
和y == inits [2] == [[], [2]]
,需要转到[[], [1], [1, 2]]
。答案 1 :(得分:8)
更紧凑的解决方案:
inits :: [a] -> [[a]]
inits = foldr ((([] :) .) . map . (:)) [[]]