2010-10-20 12 views
9

biblioteki standardowej SML zawiera różne moduły: List, Map, Nativeint, itd. Wiem, że interfejsy do tych modułów są dostarczane (np dla List module), ale jestem zainteresowany algorytmów i ich implementacji stosowanych w modułach ' Funkcje.moduły SML realizacja

Gdzie mogę to znaleźć?

Odpowiedz

5

Możesz znaleźć definicje w kodzie źródłowym OCaml. Na przykład implementacja funkcji Map jest w stdlib/map.ml w dystrybucji źródła OCaml.

4

Powinny być już zainstalowane w systemie. Najprawdopodobniej (zakładając system uniksowy) znajdują się w/usr/lib/ocaml lub/usr/local/lib/ocaml. Po prostu otwórz dowolny z plików .ml.

19

Lista wdrożenia jest interesujący się uczyć. Na przykład, funkcja map mogą być realizowane tak:

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

ale zamiast tego jest realizowane tak:

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

Jaka jest różnica? Wykonaj to:

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

Pierwsza drukuje 123, ale druga drukuje 321! Ponieważ ocena f a może powodować działania niepożądane, ważne jest, aby wymusić prawidłową kolejność. Tak właśnie działa oficjalna implementacja map. Rzeczywiście, evaluation order of arguments is unspecified in OCaml, nawet jeśli wszystkie implementacje są zgodne z tą samą kolejnością.

Zobacz także Optimizing List.map post on the Jane Street blog, aby zapoznać się z wydajnością (List.map jest skuteczny na małych listach).

+1

Kciuk w górę! (Tutaj jest wpis na blogu, ale dla początkującego jest to nieco zbyt tajemnicze: http://ocaml.janestreet.com/?q=node/71) – gasche

+0

Czy ktoś może wyjaśnić różnicę między pierwszą a drugą implementacją? ? Kiedy uruchamiam je w OCaml i F # otrzymuję 123 dla obu, nigdy 321. Ponieważ ta odpowiedź ma 7 lat, może OCaml i F # zasadniczo się zmieniły, ale wątpię w to? (Nie używam List.map, testuję dwie niestandardowe funkcje mapy tak jak jest) – jayphelps

+0

@gasche Czy masz jakiś pomysł? –