Una ragione fondamentale per l'uso esplicito di rec
ha a che fare con l'inferenza di tipo Hindley-Milner, che è alla base di tutti i linguaggi di programmazione funzionale tipizzati in modo statico (anche se modificati ed estesi in vari modi).
Se si dispone di una definizione let f x = x
, ci si aspetta che abbia il tipo 'a -> 'a
e che sia applicabile a diversi tipi 'a
in diversi punti. Allo stesso modo, se scrivi let g x = (x + 1) + ...
, ti aspetteresti che lo x
sia trattato come int
nel resto del corpo di g
.
Il modo in cui le offerte di inferenza Hindley-Milner con questa distinzione è attraverso un esplicito generalizzazione passo. A determinati punti durante l'elaborazione del programma, il sistema di tipi si interrompe e dice "ok, i tipi di queste definizioni saranno generalizzati a questo punto, così che quando qualcuno li usa, qualsiasi variabile di tipo libero nel suo tipo sarà appena istanziata, e quindi non interferirà con altri usi di questa definizione. "
Si scopre che il luogo sensato per fare questa generalizzazione è dopo aver controllato un insieme di funzioni reciprocamente ricorsive. Qualsiasi prima, e generalizzerete troppo, portando a situazioni in cui i tipi potrebbero effettivamente scontrarsi. Più tardi, e generalizzerete troppo poco, creando definizioni che non possono essere usate con istanze multiple di tipi.
Quindi, dato che il correttore di tipi deve sapere quali serie di definizioni sono reciprocamente ricorsive, che cosa può fare? Una possibilità è semplicemente fare un'analisi di dipendenza su tutte le definizioni in un ambito e riordinarle nei gruppi più piccoli possibili. Haskell lo fa in realtà, ma in linguaggi come F # (e OCaml e SML) che hanno effetti collaterali illimitati, questa è una cattiva idea perché potrebbe riordinare anche gli effetti collaterali. Così, invece, chiede all'utente di contrassegnare esplicitamente quali definizioni sono reciprocamente ricorsive, e quindi per estensione dove dovrebbe avvenire la generalizzazione.
fonte
2009-05-24 21:37:57
Vedere anche http://stackoverflow.com/questions/3739628/whats-the-reason-of-marking-a-recursive-function-as-rec-in-f – Brian