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 Intund 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 Intund 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 ... :)

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top