2010-10-20 61 views
9

Ocaml程序編寫的標準庫包含各種模塊:ListMapNativeint,等我知道的是,提供這些模塊接口(例如用於List module),但我感興趣的模塊使用的算法及其實現' 功能。Ocaml程序編寫模塊實現

我在哪裏可以找到?

回答

5

您可以在OCaml源代碼中找到定義。例如,在OCaml源代碼分發中,Map函數的實現位於stdlib/map.ml中。

4

它們應該已經安裝在您的系統上。很可能(假設是Unix系統)它們位於/ usr/lib/ocaml或/ usr/local/lib/ocaml中。只需打開.ml文件中的任何一個。

19

列表實現有趣的研究。例如,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對小型列表有效)。

+1

豎起大拇指! (這裏是博客文章,但我覺得它對於初學者來說有些過於神祕:http://ocaml.janestreet.com/?q=node/71) – gasche 2010-10-21 07:53:20

+0

任何人都可以澄清第一個和第二個實現之間的區別?當我在OCaml和F#中運行它們時,我得到了123兩個,從來沒有321.因爲這個答案是7歲,也許OCaml和F#從根本上改變了,但我懷疑它? (我沒有使用List.map,我正在測試兩個自定義地圖函數) – jayphelps 2017-05-10 01:37:37

+0

@gasche任何想法? – 2017-05-10 05:41:02