gpt4 book ai didi

ocaml - Ocaml 中的列表理解?

转载 作者:行者123 更新时间:2023-12-02 03:12:45 25 4
gpt4 key购买 nike

Ocaml 电池似乎有理解语法: http://en.wikipedia.org/wiki/List_comprehension#OCaml

但是,我应该包含什么模块才能使用此语法?我已经打开电池,但它不起作用。或者是否有更惯用的方法来进行列表理解?我可以使用 List.map 和 BatList.remove_if 来实现类似的结果,但这不太优雅。

最佳答案

目前 OCaml 中有两个库提供列表理解,一个以前是 OCaml Batteries 的一部分,另一个随 camlp4 一起提供。两者都没有被广泛使用,我个人不建议您使用任何一个。

要使列表理解起作用,您需要更改语言的语法。这可以通过使用 camlp4 预处理器对以扩展语法编写的程序进行预处理来完成。此外,列表理解并不是 OCaml 社区的一等公民,并且现代工具包也没有很好地支持它。尽管如此,您仍然可以在顶层轻松使用它,为此您需要安装列表理解包:

opam install pa_comprehension 

并使用以下指令将其加载到顶层:

# #use "topfind";;
# #camlp4o;;
# #require "pa_comprehension";;
# open Batteries;;
# [? 2 * x | x <- 0 -- max_int ; x * x > 3 ?];;

但是,我个人认为列表理解并不是构建代码的最佳方式。

没有理解的生活

您提供的示例可以使用core_kernel Sequence模块(电池Enum的模拟)来表达

let f n =
Sequence.(range 0 n |>
filter ~f:(fun x -> x * x > 3) |>
map ~f:(fun x -> x * 2))

因此,filter |> map 是一种常见的习惯用法,因此存在一个 filter_map 函数:

let f n =
Sequence.(range 0 n |>
filter_map ~f:(fun x ->
if x * x > 3 then Some (x * 2) else None))

您可能会注意到,这个示例比列表理解需要更多的代码。但是,一旦您的程序开始从带有整数的简单 hello world 应用程序成熟到更复杂的应用程序,您就会同意使用显式迭代器更具可读性和理解性。

此外,由于 Core 中的库非常一致,因此您可以使用简单的 List 而不是 Sequence,只需将后者替换为以前的。当然,与 Sequence 不同,List 是急切的,因此使用列表来玩 max_int 并不是一个好主意。

此外,由于所有容器都是 monad,因此您可以使用 monadic 运算符进行映射,例如:

let odds n = List.(range 0 n >>| fun x -> x * 2 + 1)

关于ocaml - Ocaml 中的列表理解?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27652428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com