我使用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玩項目歐拉問題。所以有相當多的序列操作,在一個命令式語言中會是一個複雜的循環體。
對於你的第二個問題,我認爲你唯一的選擇是創建你自己的功能來做到這一點。雖然你會想確保它是尾遞歸的,但是。 –