Sto studiando sistemi di tipo puro, in particolare il calcolo delle costruzioni, e sto provando a utilizzare una codifica per tipi ricorsivi su di esso, che, secondo Philip Wadler, è possibile . Ad esempio, sto usando la libreria Morte Haskell per codificare i numeri di Scott forniti da Cardelli .
Un riassunto della codifica è come tale: dato un tipo ricorsivo (positivo) ...
... possiamo codificarlo come tipo sul Sistema F come ...
... oppure, usando la notazione di sistemi di tipo puro (con una esplicita ) ...
... poiché è un costruttore di tipi ( è il tipo di tipi).
Per codificare tale, dobbiamo dichiarare tre funzioni, , e , secondo Wadler, e usato da Cardelli nella codifica per i numeri di Scott.
fold: All X. (FX -> X) -> T -> X
fold = \ X. \ k: FX -> X. \ t: T. t X k
in: FT -> T
in = \ s: F T. \ X. \ k: FX -> X. k (F (piega X k) s).
(Dove è )
È banale scrivere la funzione di come indicato. Ma quando si cerca di scrivere la funzione, non sembra TYPECHECK. L'espressione ha tipo , e dovrebbe essere di tipo . Quindi deduciamo che dovrebbe essere di tipo (sembra una ). Questo non viene controllato, perché è un costruttore di tipo (di tipo ).fmap
F
Questo non sembra un refuso ... mi sto perdendo qualcosa?
fmap
! Non ho avuto esperienza sulla teoria delle categorie, ma in realtà l'ho scoperto circa 10 minuti fa su "Una nota sui tipi di dati categorici" (GC Wralth). Ora sono stato in grado di scrivere la funzione corretta, ha funzionato come un incantesimo. Grazie mille, dott. Wadler! : D