是否有必要访问monad的内部结构来编写monad变换器?
例如:我想从Data.Binary.Get中GetT获取Getmonad的变换器,但是这个模块不会暴露Getmonad的内部.这是否意味着我唯一的方法是GetT直接添加到Data.Binary.Get模块?
我已经为我正在开发的特定领域语言编写了两个monad.第一个是Lang,它应该包括逐行解析语言所需的所有内容.我知道我会想要读者,作家和国家,所以我使用了RWSmonad:
type LangLog = [String]
type LangState = [(String, String)]
type LangConfig = [(String, String)]
newtype Lang a = Lang { unLang :: RWS LangConfig LangLog LangState a }
deriving
( Functor
, Applicative
, Monad
, MonadReader LangConfig
, MonadWriter LangLog
, MonadState LangState
)
Run Code Online (Sandbox Code Playgroud)
第二个是Repl,它使用Haskeline与用户交互:
newtype Repl a = Repl { unRepl :: MaybeT (InputT IO) a }
deriving
( Functor
, Applicative
, Monad
, MonadIO
)
Run Code Online (Sandbox Code Playgroud)
似乎都独立工作(他们编译和我与他们在GHCI行为玩耍了),但我一直无法嵌入Lang …