Tutti ADT sono isomorfi (quasi - vedi end) per una qualche combinazione di (,)
, Either
, ()
, (->)
, Void
e Mu
dove
data Void --using empty data decls or
newtype Void = Void Void
e Mu
calcola il punto fisso di un funtore
newtype Mu f = Mu (f (Mu f))
quindi ad esempio
data [a] = [] | (a:[a])
è uguale
data [a] = Mu (ListF a)
data ListF a f = End | Pair a f
che si è isomorfo a
newtype ListF a f = ListF (Either() (a,f))
dal
data Maybe a = Nothing | Just a
è isomorfo a
newtype Maybe a = Maybe (Either() a)
avete
newtype ListF a f = ListF (Maybe (a,f))
che può essere inline nei mu per
data List a = List (Maybe (a,List a))
e la tua definizione
data List a = List a (Maybe (List a))
è solo lo svolgersi del Mu e l'eliminazione del esterna Forse (corrispondente a liste non vuote)
e il gioco è fatto ...
un paio di cose
Uso ADT personalizzati aumenta la chiarezza e il tipo di sicurezza
Questa universalità è utile: vedo GHC.Generic
Va bene, detto quasi isomorfo. Non è esattamente, e cioè
hmm = List (Just undefined)
non ha valore equivalente nella [a] = [] | (a:[a])
definizione di liste. Questo perché i tipi di dati Haskell sono coinduttivi ed è stato a point of criticism of the lazy evaluation model. È possibile aggirare questi problemi solo con le somme e prodotti severi (e chiamare da funzioni di valore), e l'aggiunta di un costruttore dati speciali "pigro"
data SPair a b = SPair !a !b
data SEither a b = SLeft !a | SRight !b
data Lazy a = Lazy a --Note, this has no obvious encoding in Pure CBV languages,
--although Laza a = (() -> a) is semantically correct,
--it is strictly less efficient than Haskell's CB-Need
e poi tutti gli isomorfismi possono essere codificati con fedeltà.
'Sup dawg ho sentito che ti piace Monads, così ho messo una Monade nella tua Monad ...! hai visto 'Maybe String' è in realtà di tipo' Maybe [Char] ', ma penso che stai reinventando i trasformatori Monad (vedi http://en.wikibooks.org/wiki/Haskell/Monad_transformers) ma io sono Non sono sicuro di come io stesso non abbia molta familiarità con le monadi in questo momento. – epsilonhalbe
Oh, ho visto molti 'Maybe String' (http://www.haskell.org/hoogle/?hoogle=Maybe+%5BChar%5D)[here] ma hanno un significato diverso. Ho appena sottolineato che '[]' è una specie di 'Nothing' e cose del genere, quindi ho pensato di usare' Nothing' per rimuovere la "ridefinizione". – L01man
Non è una ridefinizione. Elenca e forse ha semantica diversa se usata come monade. Anche sfocare la linea e gettare via lo zucchero di sintassi (soprattutto i modelli di lista) è assolutamente stupido. –