我想要创建一个不同类别的副作用函数,这样我就可以将一些副作用标记为比其他副作用更安全。
我想在Fay副作用单体上创建一个新类型,并在do表示法中使用它,所以我如下所示:
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE PackageImports #-}
import "base" Control.Monad
newtype ReadFay a = ReadFay { readFay :: Fay a } deriving MonadA这一点,编译器找不到base包。在费伊有可能做到这一点吗?
我仍然可以为>>=、return等创建自己的ReadFay版本,但是能够在do符号中使用它就更好了。
或者,有没有更好的方法,如何创造一个不同类别的副作用比我的方法?
发布于 2014-11-19 11:59:38
看来我需要让
{-# LANGUAGE RebindableSyntax #-}若要重写函数,do符号正在调用该函数。然后,我需要在我计划在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 ()https://stackoverflow.com/questions/26998475
复制相似问题