Perché la parola chiave rec è necessaria in F #?

28

In F # è necessario utilizzare la parola chiave rec . In Haskell non è necessario dire esplicitamente se una determinata funzione è ricorsiva o meno.

Dato il ruolo della ricorsione nella programmazione funzionale, il design di F # mi sembra piuttosto strano. È una buona decisione sul design del linguaggio o esiste solo per ragioni storiche o a causa di un vincolo di implementazione?

    
posta Simon 28.08.2012 - 12:11
fonte

3 risposte

16

C'è una differenza intrinseca nella semantica di Haskell e F #. In Haskell, una chiamata di funzione non esegue alcun calcolo reale, ma alloca un oggetto heap noto come "thunk". Va perfettamente bene che un thunk abbia un link a se stesso o un altro thunk. Tuttavia, in F #, una chiamata di funzione è una chiamata effettiva, che rende espressioni come let x = 1 : 2 : x in x non valide, in quanto richiede x da costruire prima che venga creato 1 : 2 : x . Tuttavia, è ancora una definizione più o meno ragionevole per la lista infinita, un modo per definirlo dovrebbe esistere. Qui giace le radici per rec . Se vuoi di più, cerca e leggi la semantica operativa per SML e Haskell - è diverso.

    
risposta data 28.08.2012 - 12:41
fonte
19

Questa domanda ha ricevuto risposta su SO , e include alcuni forti background storici per cui viene usato "rec".

Ecco l'importante citazione per i posteri:

Functions are not recursive by default in the French CAML family of languages (including OCaml). This choice makes it easy to supercede function (and variable) definitions using let in those languages because you can refer to the previous definition inside the body of a new definition. F# inherited this syntax from OCaml.

    
risposta data 28.08.2012 - 16:01
fonte
12

Un% co_de ricorsivo definisce una semantica significativamente più complessa di una normale. Pertanto, per motivi di semplicità e pulizia del linguaggio, c'è una buona ragione per avere entrambi, proprio come avere separato let , let e let* in Schema.

Semplice letrec equivale a let x = y in z . Un let ricorsivo è molto più complicato e potrebbe comportare l'uso di un combinatore a virgola fissa.

    
risposta data 28.08.2012 - 12:23
fonte

Leggi altre domande sui tag