从Fay newtype派生Monad以启用表示法

时间:2014-11-18 15:56:20

标签: fay

我想创建一个不同类别的副作用函数,所以我可以将一些副作用标记为比其他副作用更安全。

我想在Fay副作用monad上创建 newtype 并在 do 表示法中使用它,所以我声明它就像这样:

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

此时,编译器无法找到base包。有可能以某种方式在fay中做到这一点吗?

我仍然可以为>>=创建我自己的returnReadFay等版本,但是能够在中使用表示法很好。

或者,有没有更好的方法,如何创建不同类型的副作用而不是我的方法?

1 个答案:

答案 0 :(得分:1)

看起来我需要启用

{-# LANGUAGE RebindableSyntax #-}

覆盖执行表示法正在调用的函数。 然后我需要在我计划在 do 表示法中使用的函数中实现对 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 ()