我经常使用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库提供了惰性列表处理?我正在寻找这些方面的东西:
type 'a lazy_list = (*'*)
| Nil
| Cons of 'a * 'a lazy_list lazy_t
let from f =
let rec gen n =
lazy
(
match f n with
| Some x ->
Cons (x, gen (n + 1))
| None ->
Nil
)
in
gen 0
Run Code Online (Sandbox Code Playgroud)
与回溯 Camlp4解析器的Stream类型和语法糖的集成将是很好的.