Получите Monad от нового типа Fay, чтобы сделать запись нотации

Я хочу создать различные классы функций с побочными эффектами, чтобы я мог пометить некоторые из побочных эффектов как более безопасные, чем другие.

Я хотел бы создать новый тип поверх Fay побочный эффект монады и использовать его в нотации do, поэтому я объявляю это так:

{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE PackageImports #-}
import "base" Control.Monad
newtype ReadFay a = ReadFay { readFay :: Fay a } deriving Monad

На данный момент, компилятор не может найти base пакет. Можно это как нибудь в фе сделать?

Я все еще могу создавать свои собственные версии >>=, returnи т. д. для ReadFay, но иметь возможность использовать его в нотации do было бы неплохо.

Или, есть ли лучший способ, как создать другой класс побочных эффектов, чем этот мой подход?

1 ответ

Решение

Похоже, мне нужно включить

{-# LANGUAGE RebindableSyntax #-}

переопределить функции, которые вызывает нотация do. Затем мне нужно реализовать перенос и распаковку в / из newtype в функциях, которые я планирую использовать в нотации do, и затемнить Prelude из них:

myFayReturn :: a -> ReadFay a
myFayReturn x = ReadFay $ return x

myFayBind :: ReadFay a -> (a -> ReadFay b) -> ReadFay b
myFayBind = \a b -> ReadFay $ runReadFay a >>= (runReadFay . b)

newtype ReadFay a = ReadFay { runReadFay :: Fay a }

doNotation :: ReadFay ()
doNotation = let
    x >>= y = myFayBind x y
    return = myFayReturn
    in do
        u <- ReadFay $ putStrLn "A"
        return ()
Другие вопросы по тегам