我必须使用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
你一起写东西需要考虑两件事:
z
:应该inits []
是什么?f
:如果你有一个清单xs == x:xs'
,你怎么能构建inits xs
从x
和y == inits xs'
?在纸上完成一些小例子可能有所帮助.例如
inits [1]
递归:你有x == 1
和y == inits [] == [[]]
和需要去[[], [1]]
.inits [1, 2]
递归:你有x == 1
和y == inits [2] == [[], [2]]
和需要去[[], [1], [1, 2]]
.更紧凑的解决方案:
inits :: [a] -> [[a]]
inits = foldr ((([] :) .) . map . (:)) [[]]
Run Code Online (Sandbox Code Playgroud)