我使用F#很多。 F#中的所有基本集合都实现IEumberable接口,因此使用F#中的单个Seq
模块访问它们是很自然的。这在OCaml中可能吗?IEnumerable <T> in OCaml
另一个问题是F#中的'a seq
是懒惰的,例如,我可以创建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模块。但它的功能似乎非常有限,并不像F#中的'a seq
一般。
顺便说一句,我最近使用OCaml玩项目欧拉问题。所以有相当多的序列操作,在一个命令式语言中会是一个复杂的循环体。
对于你的第二个问题,我认为你唯一的选择是创建你自己的功能来做到这一点。虽然你会想确保它是尾递归的,但是。 –