如何从ocaml列表中获取子列表

2024-03-31

我正在查看列表文档。图书馆好像没有提供sublist功能。

我正在尝试从中获取元素列表i to j。现在我必须把它写成:

let rec sublist list i j =
  if i > j then
    []
  else
    (List.nth list i) :: (sublist list (i+1) j)

这很简洁,但我质疑效率List.nth,因为如果是O(n),我宁愿用不太简洁的方式来写它。

我想知道他们为什么不提供List.sublist函数,如果List.nth is not O(1),因为这是一个非常常见的操作..


let rec sublist b e l = 
  match l with
    [] -> failwith "sublist"
  | h :: t -> 
     let tail = if e=0 then [] else sublist (b-1) (e-1) t in
     if b>0 then tail else h :: tail
;;

sublist 3 5 [1;2;3;4;5;6;7;8;9] ;;
- : int list = [4; 5; 6]

以上或多或少是 newacct 解决方案的砍伐版本。 newacct 的解决方案分配一个中间列表(drop i list),编译器在 Haskell 中可以进行优化,但在 ML 中则困难得多。因此,他的版本非常适合 Haskell 函数,但对于 ML 函数来说稍显次优。两者之间的差别只是一个常数因子:都是 O(e)。 zrr 的版本是 O(length(l)) 因为List.filteri不知道f只返回false一段时间后,它为所有元素调用它l.

我不太乐意让b变为负数,但不存在的版本更为复杂。

如果您有兴趣,可以参考很多有关森林砍伐的参考文献:http://homepages.inf.ed.ac.uk/wadler/topics/deforestation.html http://homepages.inf.ed.ac.uk/wadler/topics/deforestation.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从ocaml列表中获取子列表 的相关文章

随机推荐

  • div悬停背景颜色改变?

    我怎样才能使它的行为就像一行 div 是锚点一样 所以当我将鼠标悬停在它上面时 它会返回红色 CSS e width 90px border right 1px solid 222 text align center float left
  • Doxygen:在不更改 CSS 的情况下显示数字 Enum 值?

    我需要一种方法让 doxygen 在 doxygen 输出中显示枚举成员的实际值 例如我有 MyEnum typedef enum My Enum MY ENUM 0
  • FQL 图形 API:共同的朋友

    我知道您无法找到朋友的朋友 但是您可以使用某些查询以计算有效的方式找到共同的朋友吗 我什至可以遍历我的朋友来查看他们中哪些是有目标的朋友吗 有什么好的办法可以交到朋友吗 你可以这样做 facebook new Facebook array
  • 我可以像对待数组一样对待结构吗?

    我有一个用于保存 4D 矢量的结构 struct float x float y float z float w vector4f 我正在使用一个库 该库具有一些对向量进行操作但以浮点指针作为参数的函数 调用类似的东西是否合法doSomet
  • 如何使用 Groovy 添加 XML 属性?

    我需要将 属性添加到 Groovy 中 XML 片段的根元素 我想用XmlSlurper 怎么做 添加元素很容易 在 Groovy 控制台中运行此命令以验证其是否有效 import groovy xml StreamingMarkupBui
  • 有没有办法通过 MVC 应用程序中的特定控制器操作来提供 Blazor 应用程序?

    我想在现有的 ASP NET Core 3 0 MVC 项目中设置一个控制器操作来为 Blazor 应用程序提供服务 我过去见过与其他 SPA 框架类似的东西 操作的视图仅包含包含捆绑包的脚本标记 通常还有一些其他设置 例如将 SPA 构建
  • Prometheus Java 摘要指标是线程安全的吗?

    普罗米修斯是Java吗Summary对象线程安全 如果我在类中将其声明为静态 则该类的所有实例都将使用它 Prometheus 是否为该度量对象实现了线程安全 Prometheus 客户端库负责处理方向检测的线程安全等细节 例如Summar
  • is_numeric() 与 is_float() 与 is_int()

    我的理解是 if is numeric input true 那么要么 is float input true OR is int input true OR input 0 OR input是一个数字字符串 意味着如果没有用引号括起来 它
  • FFMPEG 在视频末尾添加图像

    我需要使用 FFMPEG 在 mp4 视频文件末尾添加一秒钟的图像 我的视频尺寸是 WxH 图像尺寸是 MxM 因此视频和图像尺寸不同 我尝试了不同的选项 以便在视频末尾添加图像 ffmpeg i concat videoIn mp4 im
  • iOS 将照片保存在应用程序特定的相册中

    我正在创建一个 iOS 5 应用程序 我想将照片保存到设备中 我想将照片保存到我的应用程序特定的相册中 因此我需要创建相册 然后将照片保存到相册中 我知道如何创建相册 ALAssetsLibrary library ALAssetsLibr
  • R:加速“group by”操作

    我有一个模拟 中间有一个巨大的聚合和组合步骤 我使用 plyr 的 ddply 函数对这个过程进行了原型设计 它可以很好地满足我的大部分需求 但我需要更快的聚合步骤 因为我必须运行 10K 次模拟 我已经在并行扩展模拟 但如果这一步骤更快
  • 设计:新错误(可加密)

    我已经一周没有碰过我的代码了 但是当我捆绑并尝试运行我的网络服务器时 我现在收到以下错误 这让我死在了水里 按照错误输出中的建议包含可设计加密的 gem 并不能解决问题 并且仍然会导致相同的错误 任何帮助是极大的赞赏 DEVISE Devi
  • Reactjs:使用 shouldComponentUpdate() 停止在特定状态更改时重新渲染

    我的组件 onload 中有多个 setState 我的页面在单击下拉值时重新呈现 因为单击时我通过以下方式存储这些值setState 为了停止点击时重新渲染 我使用下面的代码 shouldComponentUpdate return fa
  • Nginx 反向代理配置

    我在使用 nginx 进行简单配置时遇到问题 我有一台托管 docker 容器的服务器 因此 nginx 位于容器中 所以我们调用 urlfoo com 我想要网址foo com service1实际上只是去另一个端口上的 foo com
  • CSS 中如何使用“大于”或“>”字符?

    我在 CSS 文件中多次看到这个字符 但我不知道它是如何使用的 谁能向我解释一下并展示它们如何使页面样式变得更容易 这是一个 CSS 子选择器 P gt SPAN表示将以下样式应用于作为子级的所有 SPAN 标记P tag 请注意 孩子 的
  • Visual Studio Code 中是否有像 DocBlockr 这样的代码注释功能?

    我使用 Sublime Text 3 Atom io 和 Bracket io 作为以前的编辑器 我也非常喜欢新的 Mac 版 Visual Studio 代码编辑器 Sublime 有类似 DocBlockr 的代码注释功能吗 这对我来说
  • Android Studio 0.5.9错误代码42

    每次我尝试从 eclipse 导入项目时 我都会收到这样的错误 Error Execution failed for task app mergeDebugResources 错误 无法运行命令 D Android sdk build to
  • 如何优化间接基数排序? (又名如何优化不可预测的内存访问模式)

    我用 C 编写了一个间接基数排序算法 间接 我的意思是它返回项目的索引 include
  • Kubernetes TLS 秘密证书过期

    我使用 openssl 创建通配符自签名证书 我将证书有效期设置为 到十年 我通过使用 openssl 检查证书来仔细检查有效期 我使用步骤 1 中准备的私钥和证书创建一个 Kubernetes 密钥 如下所示kubectl命令 kubec
  • 如何从ocaml列表中获取子列表

    我正在查看列表文档 图书馆好像没有提供sublist功能 我正在尝试从中获取元素列表i to j 现在我必须把它写成 let rec sublist list i j if i gt j then else List nth list i