【问题标题】:Folding results in an empty list折叠结果为空列表
【发布时间】:2014-10-31 15:30:52
【问题描述】:

我正在尝试创建一个将[1..10] 转换为[1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10] 的函数。到目前为止,我所拥有的是prepend,它将在列表的开头添加许多相同的元素:

-- prepend value num times to the start of list (eg: prepend [] 5 1 = [1,1,1,1,1]
prepend :: [a] -> Int -> a -> [a]
prepend [] _ _ = []
prepend list 0 _ = list
prepend list num value = prepend (value : list) (num - 1) value

要创建最终列表,我使用的是 foldl,如下所示:

foldl (\acc x -> (prepend acc 2 x)) [] [1..10]

我希望它通过[1..10],并且为每个元素添加 2 个 x 到 acc,但是当我将它放入 GHCI 时,我会返回 []

我是来自 C/C++ 背景的 Haskell 新手

【问题讨论】:

  • 解决您的问题:您是否检查过您的 prepend 是否有效? (提示:第一个 acc 有什么作用 - 当然是 [] - 那么第二个 acc 会是什么?)
  • 删除[] _ _ = [] 模式有效,谢谢!

标签: haskell fold


【解决方案1】:

如果你有一个空列表,并且你想添加一些元素,你真的想要返回空列表吗?不,所以删除以下行:

prepend [] _ _ = []

毕竟,prepend [] 2 0 应该是 [0,0] 而不是 []。除此之外,它工作正常,但你可以用concatMapreplicate 编写它:

concatMap (replicate 2) [1..10]

【讨论】:

  • 或者,中缀形式,[1..10] >>= replicate 2
猜你喜欢
  • 2018-04-21
  • 1970-01-01
  • 1970-01-01
  • 2018-12-24
  • 1970-01-01
  • 1970-01-01
  • 2019-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多