f# - OCaml 中的 IEnumerable<T>

标签 f# functional-programming ocaml

我经常使用 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/

    相关文章:

    c# - 没有参数的 F# 类构造函数 --- 使用 f# 的 filehelpers 时出错

    haskell - 在 Haskell 中维护复杂状态

    scala - 从一种类型的 Monoids HList 派生 HList of zeroes

    functional-programming - 在过滤掉 Rust 中的 None 元素后,是否有可能以某种方式将 Vec<Option<Value>> 转换为 Vec<Value> ?

    Ocaml Opam 安装 camlbz2

    F# 获取包含 k 个元素的子集集合

    f# - 如何访问寓言的 promise 结果

    f# - 使用 F# 代理映射减少

    autocomplete - utop 中的自动补全

    module - Ocaml破坏性替换错误