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中,我发现自己使用以下两种方法来解决此功能:
生成一个列表:
let rec range a b =
if a > b then []
else a :: range (a+1) b;;
Run Code Online (Sandbox Code Playgroud)或采用显式递归函数.
第一个生成额外的列表.第二个打破抽象,因为我需要使用更高阶函数(如map和)在序列级别上操作fold.
我知道OCaml库有Stream模块.但它的功能似乎非常有限,不像'a seqF#那样通用.
顺便说一句,我最近使用OCaml玩Project Euler问题.所以有很多序列操作,在命令式语言中将是具有复杂体的循环.
这个Ocaml库似乎提供了你所要求的.我虽然没用过它.
http://batteries.forge.ocamlcore.org/
结帐这个模块,枚举 http://batteries.forge.ocamlcore.org/doc.preview:batteries-beta1/html/api/Enum.html
我不知何故觉得Enum是比Seq更好的名字.它消除了Seqs上的小写/大写混淆.