2014-11-18 1 views
0

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

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

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

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

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

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

ответ

1

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

{-# LANGUAGE RebindableSyntax #-} 

переопределить функции, что делать нотация вызова. Тогда мне нужно реализовать обертку и разворачивать в/из Newtype в функциях, которые я планирую использовать в делать обозначения и тени на 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()