Помогите в написании монадного типа (ассоциированные классы типов?)

StackOverflow https://stackoverflow.com/questions/7304406

Вопрос

Я хочу написать класс типа MONAD, в котором будут указаны некоторые основные действия для DSL (специфичный для DSL-DENGAIN) MONAD.

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

куда ExprType указывает тип выражения и var Введет новое объявление переменной.

Идея в том, что у меня будет базовая монада Base реализация MyDSLMonad, что, возможно, просто работает на таких вещах, как Int'песок BoolS, а затем абстракции более высокого уровня будут трансформаторами Monad, которые могут работать на типах более высоких уровней.

Однако реализация для BaseS. var функция может полагаться на тот факт, что она работает только на 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 В обычном пакете Monads ... :)

Это было полезно?

Решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top