Helfen Sie beim Schreiben einer Monadentypklasse (zugehörige Typklassen?)
-
25-10-2019 - |
Frage
Ich möchte eine Monadentypklasse schreiben, die einige grundlegende Aktionen für eine DSL-Monade (Domänenspezifische Sprache) angeben.
class Monad 𝔪 => MyDSLMonad 𝔪 where
type ExprTyp 𝔪 :: * -> *
var :: String -> ExprTyp 𝔪 α -> 𝔪 (ExprTyp 𝔪 α)
wo ExprType
zeigt den Ausdruckstyp an und var
wird eine neue variable Erklärung einführen.
Die Idee ist, dass ich eine Basismonade habe Base
Implementierung MyDSLMonad
, was vielleicht nur an Dingen wie funktioniert wie Int
und Bool
's und dann höhere Abstraktionen werden Monad-Transformatoren sein, die auf höheren Typen funktionieren können.
Die Implementierung für jedoch Base
's var
Funktion kann auf die Tatsache beruhen, dass sie nur weiter funktioniert Int
und Bool
's und erfordern eine Art vom Typ Klassenbeschränkung auf der var
Funktion. Also will ich so etwas wie
class Monad 𝔪 => MyDSLMonad 𝔪 where
type ExprTyp 𝔪 :: * -> *
class ValidTypes 𝔪
var :: ValidTypes 𝔪 α => String -> ExprTyp 𝔪 α -> 𝔪 (ExprTyp 𝔪 α)
instance MyDSLMonad Base where
class ValidTypes Base = MyClass
es ist mir bewusst rmonads
Tun Sie dies über eine Art Caseing, aber gibt es einen schöneren Weg? Außerdem mag ich ein bisschen wie Monadtransformatoren mögen StateT
im regulären Monads -Paket ... :)
Lösung
Es gibt noch keinen schöneren Weg. Max Bolingbroke baut dies in GHC auf, hoffentlich wird es in 7.4 ankommen. Sehen https://twitter.com/mbolingbroke, Hier ist ein Beispiel: http://hpaste.org/50576