помочь с написанием класса типов монады (связанные типы классов?) - PullRequest
1 голос
/ 05 сентября 2011

Я хочу написать класс типа монады, который определит некоторые основные действия для монады 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 в обычном пакете монад ...:)

1 Ответ

2 голосов
/ 05 сентября 2011

Нет лучшего способа, пока. Макс Болингброк строит это в GHC, надеюсь, он прибудет в 7.4. См. https://twitter.com/mbolingbroke, вот пример: http://hpaste.org/50576

...