Помогите в написании монадного типа (ассоциированные классы типов?)
-
25-10-2019 - |
Вопрос
Я хочу написать класс типа MONAD, в котором будут указаны некоторые основные действия для DSL (специфичный для DSL-DENGAIN) MONAD.
class Monad 𝔪 => MyDSLMonad 𝔪 where
type ExprTyp 𝔪 :: * -> *
var :: String -> ExprTyp 𝔪 α -> 𝔪 (ExprTyp 𝔪 α)
куда ExprType
указывает тип выражения и var
Введет новое объявление переменной.
Идея в том, что у меня будет базовая монада Base
реализация MyDSLMonad
, что, возможно, просто работает на таких вещах, как Int
'песок Bool
S, а затем абстракции более высокого уровня будут трансформаторами Monad, которые могут работать на типах более высоких уровней.
Однако реализация для Base
S. 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