2010-10-20 21 views
9

la biblioteca estándar de Ocaml contiene varios módulos: List, Map, Nativeint, etc. Sé que las interfaces de estos módulos se proporcionan (por ejemplo, para la List module), pero estoy interesado en los algoritmos y sus implementaciones utilizados en los módulos 'funciones.módulos ocaml aplicación

¿Dónde puedo encontrar eso?

Respuesta

5

Puede encontrar las definiciones en el código fuente OCaml. Por ejemplo, la implementación de las funciones Map está en stdlib/map.ml en la distribución de fuente OCaml.

4

Ya deben estar instalados en su sistema. Lo más probable (asumiendo un sistema Unix) que se encuentran en/usr/lib/ocaml o/usr/local/lib/ocaml. Simplemente abra cualquiera de los archivos .ml.

19

La Lista de aplicación es interesante estudiar. Por ejemplo, la función map podría implementarse como esto:

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

sino que se implementa de la siguiente:

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

Cuál es la diferencia? Ejecute esto:

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

¡El primero imprime 123, pero el segundo imprime 321! Dado que la evaluación de f a podría producir efectos secundarios, es importante forzar el orden correcto. Esto es lo que hace la implementación oficial del mapa. De hecho, el evaluation order of arguments is unspecified in OCaml incluso si todas las implementaciones siguen el mismo orden.

Consulte también el Optimizing List.map post on the Jane Street blog para consideraciones sobre el rendimiento (List.map es eficiente en listas pequeñas).

+1

Thumbs up! (Aquí está la publicación del blog, pero me parece un poco demasiado arcano para un principiante: http://ocaml.janestreet.com/?q=node/71) – gasche

+0

¿Alguien puede aclarar la diferencia entre la primera y la segunda implementación? ? Cuando los ejecuto en OCaml y F # recibo 123 para ambos, nunca 321. Dado que esta respuesta tiene 7 años, tal vez OCaml y F # cambiaron fundamentalmente, ¿pero lo dudo? (No estoy usando List.map, estoy probando las dos funciones de mapa personalizadas como está) – jayphelps

+0

@gasche ¿Alguna idea? –