list - 努力在 Haskell 中提取列表的一部分
问题描述
我正在尝试实现一个基本功能,但我没有练习 Haskell 并且正在苦苦挣扎,所以非常感谢一些帮助。我的问题具体是如何按索引选择列表的一部分。我知道如何用其他语言使用,但一直在苦苦挣扎
[ x | x <- graph, x!! > 5 && x!! <10 ]
我一直在摆弄类似于上面的基本列表理解,虽然我知道这是不对的,但我希望有一个类似的简单解决方案可用。如果有人想要更多信息或想帮助解决进一步的问题,我在下面提供了更多信息,谢谢!
type Node = Int
type Branch = [Node]
type Graph= [Node]
next :: Branch -> Graph -> [Branch]
为这两张照片道歉,但这似乎是传达信息的最佳方式。
解决方案
正如评论中指出的那样,!!
并没有以您期望的方式为您提供值的索引。它只是获取列表元素的中缀。
没有办法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)
然而,如果我们想做一些其他的选择(例如所有偶数索引),我们仍然可以回到列表推导。
推荐阅读
- css - 如何将 toastr-rails gem 添加到 Rails 6 项目?
- flutter - 如何使用 Dart PDF 包创建自定义页面宽度?
- datatable - page length not showing after adding export option in DataTables Library
- android - 在相机预览中识别文本并在文本上绘制一个矩形
- javascript - 如何在同一个应用程序上下载由 django 应用程序创建的 word 文档
- ubuntu - 更新后 Ubuntu 19.10 卡在徽标闪屏上,恢复模式也无法正常工作
- powershell - 用于更新文本文件参数的批处理/Shell 脚本
- laravel-5 - 如何修复 Laravel 旧值 htmlspecialchars() 期望参数 1 是字符串,给定数组?
- java - 无法为 Junit 方法创建模拟调用
- powershell - Powershell robocopy 日志记录