Получите 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 ()