【问题标题】:How do you solve this Haskell problem?你如何解决这个 Haskell 问题?
【发布时间】:2011-01-26 05:06:13
【问题描述】:

我想定义一个函数 replicate 以仅使用列表推导通过其值复制数字列表,例如:

replicate [5,1,3,2,8,1,2]
output: [5,5,5,5,5,1,3,3,3,2,2,8,8,8,8,8,8,8,8,1,2,2]

我知道这很容易使用内置的“复制”功能,但只允许列表理解,我该怎么做?

谢谢!

【问题讨论】:

  • 感谢您的建议,我现在正要添加它,但 MtnViewMark 打败了我。

标签: haskell list-comprehension


【解决方案1】:

整洁的小问题。我是这样解决的。

replicate list = [ a | a <- list, _ <- [1..a]]

前奏>复制[5,1,3,2,8,1,2]

[5,5,5,5,5,1,3,3,3,2,2,8,8,8,8,8,8,8,8,1,2,2]

它获取列表中的每个值,创建自己的许多副本, 然后移动到下一个值。

【讨论】:

  • 它有效,但我不知道如何。似乎'b'与'a'没有任何关系,但它使它有多个副本。有趣的是这是如何工作的。
  • 提示:您可以阅读简单的列表推导式,类似于将值累积到列表末尾的命令式循环。 a &lt;- list 表示“循环遍历list 的每个元素”,b &lt;- [1..a] 是该循环内的一个循环,表示“循环 b 从 1 到 a”。开头的a 表示每次将a 累积到列表的末尾。
  • 我建议使用 _ 而不是 b 以表明您实际上并不关心 b 的值。
  • 要添加到 user207442,如果我们有一个 [x|exp] 的列表,该列表将包含所有 exp 为 true 的 x。如果exp 包含多个元素(如这里,用逗号分隔),则使用叉积。 a &lt;- list, b &lt;- [1..a] 表示采用a(作为list 的一个元素)和b 的所有组合。由于b 贡献了a 元素数量,我们最终得到a 次a 元素。
【解决方案2】:

踢球:

import Control.Monad
import Control.Monad.Instances

repList = concatMap $ join replicate

【讨论】:

    猜你喜欢
    • 2020-11-30
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 2011-06-07
    相关资源
    最近更新 更多