Я хочу написать класс типа монады, который определит некоторые основные действия для монады DSL (предметно-ориентированный язык).
class Monad ? => MyDSLMonad ? where
type ExprTyp ? :: * -> *
var :: String -> ExprTyp ? α -> ? (ExprTyp ? α)
, где ExprType
указывает тип выражения, а var
вводит новое объявление переменной.
Идея заключается в том, что у меня будет базовая монада Base
, реализующая MyDSLMonad
, которая, возможно, просто работает с такими вещами, как Int
и Bool
, и тогда абстракции более высокого уровня будут монадой. трансформаторы, которые могут работать на типах более высокого уровня.
Однако реализация функции Base
*1014* может основываться на том факте, что она работает только на Int
и Bool
, и требует какого-то ограничения класса типов на var
функция. Итак, я хочу что-то вроде
class Monad ? => MyDSLMonad ? where
type ExprTyp ? :: * -> *
class ValidTypes ?
var :: ValidTypes ? α => String -> ExprTyp ? α -> ? (ExprTyp ? α)
instance MyDSLMonad Base where
class ValidTypes Base = MyClass
Я знаю, rmonads
сделать это через какой-то случай, но есть ли лучший способ? Кроме того, мне нравится иметь монадные трансформаторы типа StateT
в обычном пакете монад ...:)