Mientras lee el artículo "Data types a la carte" by Wouter Swierstra, tengo pegado a traducir el siguiente código de Haskell en Scala:parametrizado tipo de datos en Scala
data Expr f = In (f (Expr f))
Expr
es el tipo de datos utilizado para la representación de expresiones aritméticas en la forma en que específica expresiones pueden escribirse de la siguiente manera:
data Val e = Val Int
type IntExpr = Expr Val
data Add e = Add e e
type AddExpr = Expr Add
Mi problema es en la implementación de f
(que podría ser considerado como el firma del constructor) en Scala.
P.S. Definición de un co-producto de dos firmas, puede más adelante combinar tipos de datos, obtener una expresión de tipo Expr (Val :+: Add)
:
data (f :+: g) e = Inl (f e) | Inr (g e)
addExample :: Expr (Val :+: Add)
addExample = In (Inr (Add (In (Inl (Val 118))) (In (Inl (Val 1219)))))
* n.b. * - [tag: adt] se trata de "Herramientas de desarrollo Android", no de tipos de datos algebraicos, y de todos modos el acrónimo ADT aplicado a los tipos de datos generalmente significa * abstract *, not * algebraic *. –
Hay dos problemas que obstaculizan la implementación de esto de manera directa: 1) Cuantificación universal. 2) Unificación de orden superior. – Apocalisp