我必须使用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)
| 归档时间: |
|
| 查看次数: |
881 次 |
| 最近记录: |