Todos ADTs son isomorfos (casi - véase el final) a alguna combinación de (,)
, Either
, ()
, (->)
, Void
y Mu
donde
data Void --using empty data decls or
newtype Void = Void Void
y Mu
calcula el punto fijo de un funtor
newtype Mu f = Mu (f (Mu f))
así que por ejemplo
data [a] = [] | (a:[a])
es la misma que
data [a] = Mu (ListF a)
data ListF a f = End | Pair a f
que en sí misma es isomorfo a
newtype ListF a f = ListF (Either() (a,f))
desde
data Maybe a = Nothing | Just a
es isomorfo a
newtype Maybe a = Maybe (Either() a)
tiene
newtype ListF a f = ListF (Maybe (a,f))
que puede ser inline en las mu a
data List a = List (Maybe (a,List a))
y su definición
data List a = List a (Maybe (List a))
es sólo el despliegue de la Mu y la eliminación del exterior Tal vez (correspondiente a listas no vacías)
y listo ...
un par de cosas
Uso de los ADT personalizados aumenta la claridad y el tipo de seguridad
Esta universalidad es útil: veo GHC.Generic
Vale, dijo casi isomorfo. No es exactamente, a saber
hmm = List (Just undefined)
no tiene valor equivalente en la definición de las listas [a] = [] | (a:[a])
. Esto se debe a que los tipos de datos Haskell son coinductivos y han sido a point of criticism of the lazy evaluation model. Usted puede obtener en torno a estos problemas utilizando sólo sumas y productos estrictas (y por llamar a funciones de valor), y añadiendo un constructor de datos especiales "perezoso"
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
y luego todos los isomorfismos se pueden codificar con fidelidad.
'Sup dawg te escuché como las Mónadas, así que puse una Mónada en tu Mónada ...! has visto 'Maybe String' en realidad es del tipo' Maybe [Char] ', pero creo que estás reinventando los transformadores Monad (mira http://en.wikibooks.org/wiki/Haskell/Monad_transformers) pero yo soy No estoy seguro ya que yo mismo no estoy muy familiarizado con las mónadas en este momento. – epsilonhalbe
Oh, vi muchos 'Maybe String' (http://www.haskell.org/hoogle/?hoogle=Maybe+%5BChar%5D)here aquí) pero tienen un significado diferente. Solo señalé que '[]' es una especie de 'Nada' y demás, así que pensé en usar' Nothing' para eliminar la "redefinición". – L01man
No es redefinición. List y Maybe tienen semántica diferente cuando se usan como mónadas. También difuminar la línea y tirar la sintaxis del azúcar (especialmente los patrones de la lista) es francamente estúpido. –