Domanda

Voglio scrivere una classe di tipo monade che specificare alcune azioni di base per una DSL (linguaggio specifico del dominio) monade.

class Monad 𝔪 => MyDSLMonad 𝔪 where
    type ExprTyp 𝔪 :: * -> *
    var :: String -> ExprTyp 𝔪 α -> 𝔪 (ExprTyp 𝔪 α)

dove ExprType indica il tipo di espressione, e var introdurrà una nuova dichiarazione variabile.

L'idea è che avrò un Base base di monade MyDSLMonad attuazione, che forse solo lavora su cose come Int e di Bool di, e poi astrazioni di livello superiore saranno trasformatori monade, che possono lavorare sui tipi di livello superiore.

Tuttavia, l'implementazione per la funzione di Base var potrebbe fare affidamento sul fatto che funziona solo su Int e di Bool di, e richiedono una sorta di tipo di vincolo di classe sulla funzione var. Quindi, voglio qualcosa di simile

class Monad 𝔪 => MyDSLMonad 𝔪 where
    type ExprTyp 𝔪 :: * -> *
    class ValidTypes 𝔪
    var :: ValidTypes 𝔪 α => String -> ExprTyp 𝔪 α -> 𝔪 (ExprTyp 𝔪 α)

instance MyDSLMonad Base where
    class ValidTypes Base = MyClass

Sto rmonads consapevoli fare questo attraverso un certo tipo caseing, ma c'è un modo più bello? Inoltre, ho un po 'come avere trasformatori monade come StateT nel pacchetto monadi normale ...:)

È stato utile?

Soluzione

Non c'è modo più bello, ancora. Max Bolingbroke sta costruendo questo GHC, si spera arriverà in 7.4. Vedere https://twitter.com/mbolingbroke , ecco un esempio: http://hpaste.org/50576

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top