Ocaml程序編寫的標準庫包含各種模塊:List
,Map
,Nativeint
,等我知道的是,提供這些模塊接口(例如用於List module),但我感興趣的模塊使用的算法及其實現' 功能。Ocaml程序編寫模塊實現
我在哪裏可以找到?
Ocaml程序編寫的標準庫包含各種模塊:List
,Map
,Nativeint
,等我知道的是,提供這些模塊接口(例如用於List module),但我感興趣的模塊使用的算法及其實現' 功能。Ocaml程序編寫模塊實現
我在哪裏可以找到?
您可以在OCaml源代碼中找到定義。例如,在OCaml源代碼分發中,Map
函數的實現位於stdlib/map.ml
中。
它們應該已經安裝在您的系統上。很可能(假設是Unix系統)它們位於/ usr/lib/ocaml或/ usr/local/lib/ocaml中。只需打開.ml
文件中的任何一個。
/usr/lib/ocaml/list.ml
等.ml
文件.ml
文件https://github.com/ocaml/ocaml/tree/trunk/stdlib列表實現有趣的研究。例如,map
功能可以實現這樣的:
let rec map f = function
| [] -> []
| a::l -> f a :: map f l
而是像這樣實現的:
let rec map f = function
| [] -> []
| a::l -> let r = f a in r :: map f l
有什麼區別?執行此操作:
List.map print_int [1;2;3] ;;
map print_int [1;2;3] ;;
第一個打印123,但第二個打印321!由於f a
的評估可能會產生副作用,因此強制執行正確的順序很重要。這是官方地圖實現的功能。事實上,即使所有實現遵循相同的順序,也可以使用evaluation order of arguments is unspecified in OCaml。
另請參閱Optimizing List.map post on the Jane Street blog以瞭解性能(List.map
對小型列表有效)。
豎起大拇指! (這裏是博客文章,但我覺得它對於初學者來說有些過於神祕:http://ocaml.janestreet.com/?q=node/71) – gasche 2010-10-21 07:53:20
任何人都可以澄清第一個和第二個實現之間的區別?當我在OCaml和F#中運行它們時,我得到了123兩個,從來沒有321.因爲這個答案是7歲,也許OCaml和F#從根本上改變了,但我懷疑它? (我沒有使用List.map,我正在測試兩個自定義地圖函數) – jayphelps 2017-05-10 01:37:37
@gasche任何想法? – 2017-05-10 05:41:02