我必须使用map通过foldr来实现inits。我得到了大部分内容,但是我的结果列表中缺少空列表元素。
inits :: [a] -> [[a]]
inits = foldr ( \ x y -> [x] : (map (x:) y) ) []
调用时会导致:
*Blueprint< inits [1,2,3]
[[1],[1,2],[1,2,3]]
我现在有点卡住了,如果有人能指出我的错误的大致方向,我会很高兴。
提前致谢
已解决:
inits :: [a] -> [[a]]
inits = foldr ( \ x y -> [] : (map (x:) y) ) [[]]
最佳答案
用 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]]
.
关于haskell - 使用foldr 实现init,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24118741/