在Haskell中如何提取列表的一部分

3

我试图实现一个基本函数,但我已经不熟悉Haskell了,所以很难,真的很需要帮助。我的问题是如何通过索引选择列表的一部分。我知道如何在其他语言中做到这一点,但一直很困难。

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

我一直在尝试着使用类似上面那样的基本列表推导式,虽然我知道那不正确,但我希望能有一个同样简单的解决方案。

如果有人想要更多信息或者愿意协助我进一步提出问题,我在下面附加了更多信息,谢谢!

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

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

这是“next”函数的单独问题

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

很抱歉使用了两张图片,但这似乎是传达信息的最佳方式。


"!!" 是一个二元运算符。 - phipsgabler
5
您可以从前面“丢弃”您不想要的元素,然后“取出”您想要保留的元素数量。 - pat
4
我想这可能能帮到你:列表切片 - andreib
谢谢你们两个,但特别感谢@wasabi,列表切片链接真的很有帮助,它完全解释了drop和take的组合! - user2733843
2个回答

1
如评论中所指出的那样,!!并不能像您期望的那样给出值的索引。它只是用于获取列表中的元素的中缀操作符。
在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)

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


0
在这种情况下,您可以使用 drop 5 <&> take 4。如drop 5 x & take 4。Drop 跳过前面的元素,take 留下从 drop 后剩余的一些元素。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接