2013-04-20 5 views
5

In OCaml 3.12.1, List.map è scritto come segue:Perché c'è una let in List.map di OCaml?

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

mi aspetto che ultima riga da scrivere come | a::l -> f a :: map f l, ma, invece, c'è un apparentemente inutile let vincolante. Perché?

risposta

9

Credo che sia lì per garantire un ordine di applicazione di funzione per la mappa. L'ordine di valutazione delle espressioni semplici in OCaml non è specificato, quindi senza l'let l'ordine delle applicazioni di f agli elementi dell'elenco non è specificato. Dato che OCaml non è un linguaggio puro, ti piacerebbe davvero che fosse specificato l'ordine (f è chiamato prima in testa alla lista, e così via ricorsivamente).

+1

Infatti, ogni versione di OCaml che ho provato (fino a 4.00.1) ha mostrato il seguente comportamento: Definire 'map' da' let rec map f = function [] -> [] | x :: xs -> f x :: map f xs ;; 'e quindi chiama' map print_string ["a"; "B"; "C"] ;; '. Questo stampa gli elementi della lista da destra a sinistra. – chris

+0

Perché è necessario specificare l'ordine qui in List.map? Penso che il fatto di essere valutato prima o dopo non abbia importanza qui, giusto? –