aiuto con la scrittura di un typeclass monade (classi tipo associato?)
-
25-10-2019 - |
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 ...:)
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