我经常使用 F#。 F# 中的所有基本集合都实现了 IEumberable 接口(interface),因此使用单个 Seq
访问它们是很自然的。 F# 中的模块。这在 OCaml 中可能吗?
另一个问题是 'a seq
在 F# 中是懒惰的,例如我可以从 1
创建一个序列至100
使用 {1..100}
或更详细地说:
seq { for i=1 to 100 do yield i }
在 OCaml 中,我发现自己使用以下两种方法来解决此功能:
let rec range a b =
if a > b then []
else a :: range (a+1) b;;
第一个生成额外的列表。第二个打破了抽象,因为我需要使用更高阶函数(例如
map
)在序列级别上进行操作。和 fold
.我知道 OCaml 库有 Stream模块。但是它的功能似乎相当有限,不如
'a seq
那么通用在 F# 中。顺便说一句,我最近正在使用 OCaml 玩 Project Euler 问题。所以有相当多的序列操作,在命令式语言中将是具有复杂主体的循环。
最佳答案
这个 Ocaml 库似乎可以提供您所要求的。虽然我没用过。
http://batteries.forge.ocamlcore.org/
checkout 这个模块,枚举
http://batteries.forge.ocamlcore.org/doc.preview:batteries-beta1/html/api/Enum.html
我不知何故觉得 Enum 是一个比 Seq 更好的名字。它消除了 Seqs 上的小写/大写混淆。
关于f# - OCaml 中的 IEnumerable<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6589959/