2010-10-20 11 views
9

Ocaml der Standardbibliothek verschiedene Module enthält: List, Map, Nativeint usw. Ich weiß, dass Schnittstellen für diese Module zur Verfügung gestellt werden (zB für die List module), aber ich bin an den Algorithmen und deren Umsetzungen in Modulen "funktioniert.Ocaml Module Implementierung

Wo finde ich das?

Antwort

5

Sie finden die Definitionen im OCaml-Quellcode. Zum Beispiel ist die Implementierung der Map Funktionen in stdlib/map.ml in der OCaml-Source-Distribution.

4

Sie sollten bereits auf Ihrem System installiert sein. Am wahrscheinlichsten (unter der Annahme eines Unix-Systems) befinden sie sich in/usr/lib/ocaml oder/usr/local/lib/ocaml. Öffnen Sie einfach eine der .ml Dateien.

19

Die Liste Implementierung ist interessant zu studieren. Zum Beispiel könnte die map Funktion wie folgt umgesetzt werden:

let rec map f = function 
    | [] -> [] 
    | a::l -> f a :: map f l 

sondern wird wie folgt umgesetzt:

let rec map f = function 
    | [] -> [] 
    | a::l -> let r = f a in r :: map f l 

Was ist der Unterschied? Führen Sie dies aus:

List.map print_int [1;2;3] ;; 
map print_int [1;2;3] ;; 

Das erste druckt 123, aber das zweite druckt 321! Da die Auswertung von f a Nebenwirkungen hervorrufen kann, ist es wichtig, die richtige Reihenfolge zu erzwingen. Dies ist, was die offizielle Kartenimplementierung tut. In der Tat, die evaluation order of arguments is unspecified in OCaml auch wenn alle Implementierungen die gleiche Reihenfolge folgen.

Siehe auch die Optimizing List.map post on the Jane Street blog für Überlegungen zur Leistung (List.map ist effizient auf kleinen Listen).

+1

Daumen hoch! (Hier ist der Blogpost, aber ich finde es ein bisschen zu geheimnisvoll für einen Anfänger: http://ocaml.janestreet.com/?q=node/71) – gasche

+0

Kann jemand den Unterschied zwischen der ersten und zweiten Implementierungen klären ? Wenn ich sie in OCaml und F # führe, erhalte ich 123 für beide, nie 321. Da diese Antwort 7 Jahre alt ist, haben sich OCaml und F # grundlegend geändert, aber ich bezweifle es? (Ich verwende nicht List.map, ich teste die beiden benutzerdefinierten Kartenfunktionen wie sie ist) – jayphelps

+0

@gasche Irgendeine Idee? –