首页 > 解决方案 > 努力在 Haskell 中提取列表的一部分

问题描述

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

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

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

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

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

这是“下一个”功能的个别问题

这是一般设置信息,但最重要的是,该图表示为扁平邻接矩阵

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

标签: listhaskelllist-comprehension

解决方案


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

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

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

zip [0..] graph

这将创建一个元组列表,每个元组都包含它们的索引和graph.

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

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

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

drop 5 (take 10 graph)

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


推荐阅读