【问题标题】:Struggling to extract a section of a list in Haskell努力在 Haskell 中提取列表的一部分
【发布时间】:2020-06-28 14:23:06
【问题描述】:

我正在尝试实现一个基本功能,但我没有练习 Haskell 并且正在苦苦挣扎,因此非常感谢一些帮助。我的问题具体是如何按索引选择列表的一部分。我知道如何使用其他语言,但一直在苦苦挣扎

[ x | x <- graph,  x!! > 5 && x!! <10 ]

我一直在摆弄类似于上面的基本列表理解,虽然我知道这不对,但我希望有一个类似的简单解决方案可用。 如果有人想了解更多信息或想帮助解决进一步的问题,我在下面提供了更多信息,谢谢!

type Node = Int
type Branch = [Node]
type Graph= [Node]

next :: Branch -> Graph ->  [Branch]

This is the individual question for the "next" function

This is the general set up information but most importantly that the graph is represented as a flattened adjacency matric

为这两张图片道歉,但这似乎是传达信息的最佳方式。

【问题讨论】:

  • !! 是二元运算符。
  • 你可以从前面drop你不想要的元素数量,然后take你想要保留的元素数量。
  • 我想这可能对你有帮助:List slice
  • 谢谢你们,但特别是@wasabi,列表切片链接真的很有帮助,它充分解释了 drop and take 的组合!

标签: list haskell list-comprehension


【解决方案1】:

正如 cmets !! 中指出的那样,它并没有以您期望的方式为您提供值的索引。它只是获取列表元素的中缀。

没有办法像这样在 Haskell 中获取 x 的索引,因为 x 对象不会跟踪它的位置。

为了解决这个问题,我们可以制作一个跟踪它们所在位置的对象列表。这可以通过zip 来实现。

zip [0..] graph

这会创建一个元组列表,每个元组都包含它们的索引和graph 中的值。

所以你可以把你的列表理解写成

[ x | (index, x) <- zip [0..] graph, index > 5, index < 10 ]

现在这不会非常快,因为它仍然需要遍历列表的每个元素,尽管我们知道在 11 号之后不会使用任何元素。为了速度,我们希望使用 takedrop 的组合。

drop 5 (take 10 graph)

但是,如果我们想做一些其他选择(例如所有偶数索引),我们仍然可以返回列表推导。

【讨论】:

    【解决方案2】:

    在这种情况下,您可以drop 5 &lt;&amp;&gt; take 4。如drop 5 x &amp; take 4。 Drop 会跳过前几个元素,并删除除 drop 后剩下的前几个元素之外的所有元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-13
      • 1970-01-01
      • 1970-01-01
      • 2021-05-10
      • 1970-01-01
      • 2021-08-15
      • 2014-07-27
      相关资源
      最近更新 更多