Construcci ´on Modular de M ´onadas con
Operaciones
Mauro Jaskelioff
CIFASIS /
Depto de Cs. de la Computaci ´on FCEIA - Universidad Nacional de Rosario
En esta charla
Estructuraci ´on de programas usando m ´onadas
Transformadores para la construcci ´on modular de m ´onadas.
El problema de levantar operaciones (lifting of operations).
M ´onadas en Cs de la Computaci ´on
Las m ´onadas son una estructura algebraica que aparece en la teor´ıa de categor´ıas
Moggi se da cuenta que pueden modelar una gran cantidad de efectos computacionales.
Estado, excepciones, continuaciones, no determinismo, entrada/salida, etc.
Las usa para estructurar la sem ´antica de lenguajes de programaci ´on CBV con efectos computacionales.
Wadler las utiliza para estructurar programas.
M ´onadas en Haskell
Especificadas por una clase de tipo, param :: ∗ → ∗ class Monad m where
return :: a → m a
(>>=) ::m a → (a → m b) → m b
Algunas m ´onadas son:
Computaciones puras typeId a = a Excepciones typeEx a = Either E a Estado typeSta = S → (a, S) Continuaciones typeCna = (a → R) → R
Int ´erpretes Mon ´adicos
data Lang = Num Int | Add Lang Lang
eval ::Monad m⇒ Lang →mInt eval (Num n) =returnn
eval (Add t u) = eval t >>=λx → eval u>>=λy → return(t + u)
eval est ´a definida para cualquier m ´onada:
La m ´onada abstrae la composici ´on de efectos
Operaciones manipuladoras de efectos
Cada m ´onadaMviene equipada con operaciones que manipulan los efectos que la m ´onada modela.
Por ejemplo: CuandoM =St (estado): get:: () →MS put::S →M() CuandoM =Ex (excepciones): throw ::E →M a handle::M a → (E →Ma) →M a CuandoM =Cn(continuaciones): callcc:: ((M a → r ) →Ma) →M a abort::R →M a
Operaciones, Operaciones y Operaciones
Las que hacen el trabajo interesante son las operaciones!
eval (Div t u) = eval t>>=λx → eval u>>=λy →
if y ≡ 0 thenthrow "Division by 0"
elsereturn(x ‘div ‘ y )
eval est ´a definido para cualquier m ´onada que implemente throw.
En general, los programas mon ´adicos est ´an definidos para cualquier m ´onada que implementa las operaciones
M ´onadas con operaciones
Podemos expresar esto en Haskell con una clase de tipo
class Monad m⇒ MonadconThrowmwhere
throw::E →ma El tipo del evaluador queda:
eval :: MonadconThrow m⇒ Lang →mInt Diferentes m ´onadas pueden ser instancia de MonadconThrow .
instance MonadconThrow Ex where
¿C ´omo combinar efectos?
Supongamos que necesitamos una m ´onadaMque implemente las operaciones de estado y excepci ´on. Entonces nos podemos preguntar:
¿Podremos estructurar la m ´onadaM como una combinaci ´on de efectos mas simples?
¿Hay una sola forma de combinar estado y excepciones?
Transformadores de M ´onadas
Un transformador de m ´onada toma una m ´onada y le agrega un efecto computacional.
Permite agregar efectos incrementalmente. t :: (∗ → ∗) → (∗ → ∗)
Posee una operaci ´onlift que levanta una computaci ´on de la m ´onada base a la m ´onada transformada.
class (Monad m, Monad (t m)) ⇒ MonadT t where lift :: m a → t m a
Ejemplos:
type S m a = S → m (a, S) type X m a = m (Either E a) type C m a = (a → m R) → m R
Transformadores de M ´onadas: algunas respuestas
¿Podremos estructurar la m ´onadaM como una combinaci ´on de efectos m ´as simples?
Podemos empezar con cualquier m ´onada y agregar capas de efectos a gusto.
¿Hay una sola forma de combinar estado y excepciones?
No, transformar la m ´onada de excepciones con el
transformador de estado no es lo mismo que transformar la m ´onada de estado con el transformador de excepciones.
S → Either E (a, S) vs. S → (Either E a, s)
¿Podemos combinar cualquier m ´onada sistem ´aticamente?
Punto flojo de los transformadores. El tensor y la suma de teor´ıas algebraicas (Hyland, Plotkin & Power) explican algunos de ellos.
Operaciones de los Transformadores
Los transformadores agregan efectos, por lo que tambi ´en deben agregar operaciones.
La m ´onada que se obtiene de usar el transformador de estado debe implementarget yput.
Uno esperar´ıa que la m ´onadaS Ex implementeget,put, y tambi ´enthrow yhandle.
En este ejemplo,get yputest ´an definidas paraS m(y en particular paraS Ex).
Perothrow :: Ex ayhandle :: Ex a → (E → Ex a) → Ex a est ´an definidas paraEx a.
¿Qu ´e es levantar una operaci ´on?
Levantar una operaci ´onσde una m ´onadama trav ´es de un transformadorT es una operaci ´onσˆcuyo tipo puede ser derivado substituyendo todas las ocurrencias demen el tipo deσ porT m.
El criterio b ´asico de correci ´on es que un programa que no usa los efectos agregados por el transformador se debe comportar de la misma manera luego de la aplicaci ´on del transformador.
Levantando operaciones
¿C ´omo levantar una operaci ´on de la m ´onada subyacente a la m ´onada transformada?
Liang, Hudak y Jones (1995) propusieron
“Proveer una operaci ´on levantada para cada par operaci ´on/transformador”
Problemas:
Demasiadas definiciones!O(|t| × |op|)
La forma de levantar una operaci ´on a trav ´es de un transformadorT1no est ´a relacionada con la forma de
levantar esa operaci ´on a trav ´es deT2.
La forma en que dos operacionesσ1yσ2se levantan a trav ´es de un mnismo transformador no tiene por qu ´e ser coherente.
Nuestro enfoque
Identificar clases de operaciones y clases de transformadores para los cuales podemos levantar
Operaciones Algebraicas
Cada transformadorT provee una funci ´on polim ´orfica lift :: Monad m ⇒ m a → T m a
Si la operaci ´onσde una m ´onadaMes de la forma A → M B, se puede levantar f ´acilmente.
A σ //M B lift //T M B
Estas operaciones se denominan algebraicas ya que existe un iso entre ellas y conjuntos deAoperaciones de aridadB(que preservan la multiplicaci ´on deM)
A → M B ∼= A × (M x )B → M x
Algebraicas:
get,set,throw, yabort
No algebraicas: handleycallcc
Generalizando las operaciones algebraicas
Generalizamos las operaciones algebraicas,
generalizando la aridad de las operaciones a un functorΣ cualquiera A × (M x )B → M x → Σ (M x ) → M x Ejemplos de Σ-operaciones: get :: (S → St a) → St a Σx = (S → x ) set :: (S × St a) → St a Σx = S × x throw :: () → Ex a Σx = () handle :: Ex a → (E → Ex a) → Ex a Σx = x × (E → X ) callcc :: ((Co a → R) → Co a) → Co a Σx = (x → R) → x abort :: R → Co a Σx = R
Operaciones con buen comportamiento
Definici ´on (Σ-operaciones algebraicas para una m ´onada M)
Es una Σ-operaci ´onop :: Σ (M x ) → M x tal que
Σ (M (M x )) op(M x ) fmap join // Σ (M x ) opx M (M x ) join //M x
Tienen una propiedad an ´aloga a las algebraicas: Σ (M x ) →alg M x ∼= Σx → M x
Esto significa que podemos levantar estas operaciones f ´acilmente!
Ejemplos de Σ-operaciones algebraicas
Todas las operaciones algebraicas son Σ-operaciones algebraicas.
Ejemplos: getyput throw abort
Sorprendentementecallcces una Σ-operaci ´on algebraica (y por lo tanto es f ´acil de levantar!)
La versi ´on decallccque aparece en la MTL se puede derivar de nuestra versi ´on:
callccMTL :: ((a →Cnb) →Cna) →Cna
callccMTL f =callcc(λk → f (λx →abort (k (return x )))) La Σ-operaci ´onhandle no es algebraica.
Transformadores Functoriales
Para poder levantar operaciones comohandle,
necesitamos mas informaci ´on acerca del tranformador. Los transformadores functoriales son una clase de transformadores de m ´onadas m ´as estructurados.
class MonadT t ⇒ FunctorialT t where tmap :: (∀a.m a → n a) → t m a → t n a Functoriales: Transformador de Estado Transformador de Excepciones No Functoriales: Transformador de Continuaciones
Levantando Σ-operaciones
Teorema
Dados
op :: Σ (M a) → M a
Transformador FunctorialT.
Existe una operaci ´onopT :: Σ (T M a) → T M aque levanta a op.
La construcci ´on deopT se puede consultar en
“Modular Monad Transformers” M. Jaskelioff, ESOP 2009.
“Monad Transformers as Monoid Transformers” M. Jaskelioff y E. Moggi, TCS 2010.
Siop es una Σ-operaci ´on algebraica, las dos maneras vistas de levantar la operaci ´on coinciden.
Abstrayendo un poco
Toda la teor´ıa funciona a un nivel m ´as general (monoides en una categor´ıa monoidal)
Las m ´onadas son una instancia de estos.
Para el ´ultimo teorema visto la categor´ıa debe ser cerrada a derecha.
Trabajo futuro: Aplicar la teor´ıa a otras estructuras.
Por ejemplo, Arrows
La abstracci ´on hizo evidente otra clase de
transformadores: Los functores monoidales, a traves de los cuales se pueden levantar operaciones m ´as generales.
Resumen
Levantamiento de operaciones en forma uniforme:
Σ-operaqci ´on algebraica Cualquier morfismo de m ´onadas Σ-operaci ´on Transformador Functorial
Monatron: Biblioteca de Transformadores de M ´onadas.
Trabajo Futuro
Encontrar otras formas de levantar operaciones. Encontrar un lifting general para teor´ıas predicativas. Extender los resultados a Arrows.
Especificaci ´on de operaci ´on levantada
Definition Σ (T M a) op T a // N a Σ (M a) op a // fmap lift OO M a lift OOTransformador de Codensidad
K M x = ∀y .(x → M y ) → M y es un transformador. liftK::M a → K M a
Se puede definir en sistemas impredicativos como F ω (y en Haskell).
Propiedades deK:
Toda Σ-operaci ´on deMda lugar a una Σ-operaci ´on algebraica deK M
Σ (M a)−→ M aop Σ (KM a)−−→opK algK M a
from :: K M a → M a, tal quefrom ◦ liftK=id.
op = Σ (M a) Σ(lift
K)
//Σ (K M a) opK //K M a from //M a