0

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

我想在副作用单子上创建一个新类型并在 do 表示法中使用它所以我这样声明它:Fay

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

A至此,编译器找不到base包。有可能以某种方式做到这一点吗?

>>=我仍然可以为、return等创建自己的版本ReadFay,但能够在do表示法中使用它会很好。

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

4

1 回答 1

1

看起来我需要启用

{-# LANGUAGE RebindableSyntax #-}

覆盖do表示法正在调用的函数。然后,我需要在我计划在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 ()
于 2014-11-19T11:59:38.163 回答