scala haskell monads

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.