scala - Auto-selección de intérpretes a través de Free Monad y Coproduct
haskell monads (1)
Rellenando la sección de respuestas de los comentarios a la pregunta original ...
El documento original de Haskell se puede encontrar aquí: Tipos de datos a la carta
Una implementación de Haskell se puede encontrar aquí: okmij.org/ftp/Haskell/extensible/ALaCarte.hs
Estoy jugando con la arquitectura de aplicaciones y las mónadas gratuitas en haskell. Lo tengo abajo, excepto por cómo llevar mi "instrucción" a la ranura correcta de mi coproducto sin dar explícitamente el camino completo a la izquierda / derecha.
Aquí está el ejemplo de haskell en el que he estado trabajando: https://gist.github.com/aaronlevin/87465696ba6c554bc72b#file-reasonable-hs
Aquí, para inyectar tipos en el coproducto, mencionamos explícitamente el camino.
Por ejemplo:
Program :: Coproduct Interaction (Coproduct Auth Logging) a
logC :: (Functor f) => (forall a. Logging a -> f a) -> String -> Free f ()
logger :: String -> Free Program ()
logger = logC (Program . Coproduct . Right . Coproduct . Right)
Aquí, el registrador debe colocarse en la ranura correcta en el coproducto manualmente con Coproduct . Right . Coproduct . Right
Coproduct . Right . Coproduct . Right
La conversación de Runar en scala usa conversiones de tipo implícitas y una clase de tipos de Inyectar para lograr este resultado: https://gist.github.com/runarorama/a8fab38e473fafa0921d#file-gistfile1-scala-L119
En resumen, me pregunto si hay una manera de hacer esto en haskell.