我想创建一个不同类别的副作用函数,所以我可以将一些副作用标记为比其他副作用更安全。
我想在Fay
副作用monad上创建 newtype 并在 do 表示法中使用它,所以我声明它就像这样:
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE PackageImports #-}
import "base" Control.Monad
newtype ReadFay a = ReadFay { readFay :: Fay a } deriving Monad
此时,编译器无法找到base
包。有可能以某种方式在fay中做到这一点吗?
我仍然可以为>>=
创建我自己的return
,ReadFay
等版本,但是能够在中使用表示法很好。
或者,有没有更好的方法,如何创建不同类型的副作用而不是我的方法?
答案 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 ()