OCaml中的IEnumerable <T>

Yin*_*Zhu 6 f# ocaml functional-programming

我经常使用F#.F#中的所有基本集合都实现了IEumberable接口,因此使用SeqF#中的单个模块访问它们是很自然的.这在OCaml中是否可行?

另一个问题是,'a seq在F#是懒惰的,例如我可以创建一个序列1,以100使用{1..100}以上冗长:

seq { for i=1 to 100 do yield i }
Run Code Online (Sandbox Code Playgroud)

在OCaml中,我发现自己使用以下两种方法来解决此功能:

  1. 生成一个列表:

    let rec range a b = 
      if a > b then []
      else a :: range (a+1) b;;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 或采用显式递归函数.

第一个生成额外的列表.第二个打破抽象,因为我需要使用更高阶函数(如map和)在序列级别上操作fold.

我知道OCaml库有Stream模块.但它的功能似乎非常有限,不像'a seqF#那样通用.

顺便说一句,我最近使用OCaml玩Project Euler问题.所以有很多序列操作,在命令式语言中将是具有复杂体的循环.

Bal*_*ala 5

这个Ocaml库似乎提供了你所要求的.我虽然没用过它.

http://batteries.forge.ocamlcore.org/

结帐这个模块,枚举 http://batteries.forge.ocamlcore.org/doc.preview:batteries-beta1/html/api/Enum.html

我不知何故觉得Enum是比Seq更好的名字.它消除了Seqs上的小写/大写混淆.


Ank*_*kur 0

您似乎正在寻找类似“惰性列表”之类的东西。看看这个问题