haskell - 使用foldr 实现init

标签 haskell fold

我必须使用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 写一些东西你需要考虑两件事:

  1. 基本情况 z :应该做什么inits []是?
  2. 递归步骤f :如果你有一个列表xs == x:xs' ,你如何构建 inits xs来自xy == inits xs'
<小时/>

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

  • 计算inits [1]递归地:你有 x == 1y == inits [] == [[]]并且需要访问 [[], [1]] .
  • 计算inits [1, 2]递归地:你有 x == 1y == inits [2] == [[], [2]]并且需要访问 [[], [1], [1, 2]] .

关于haskell - 使用foldr 实现init,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24118741/

相关文章:

haskell - 在 Haskell 中执行一系列操作时的异常处理

haskell - 文件夹如何工作?

list - 如何在 Haskell 中正确使用守卫?

haskell - 我不明白的 GHC 类型错误

recursion - 在 OCaml 中折叠列表

Java 8 : stop reduction operation from examining all Stream elements

haskell - Haskell 有 foldlM' 吗?

jquery - 同位素折叠(元素重叠)

Haskell 类型声明

haskell - Data.Vector.dropWhile 的有效替代方案