我正在使用一个在方便的 ReaderT monad 中携带东西的包。它们的 runReaderT/unwrapping 函数位于隐藏模块中。我希望能够在任意环境中任意/手动打开它。所以我对手动操作没有任何疑虑——但是,环境类型有一个隐藏的数据构造函数,所以我无法生成一个使用 runReaderT 进行类型检查的环境。
有什么办法可以解决这个问题吗?还是我应该放弃这个不可能并尝试重组我的程序?我计划将此项目部署到具有自动构建系统的远程系统,因此我不确定是否要直接编辑包的源代码/分叉它。
具体来说,我正在使用scotty
,并且正在尝试runActionM
从Web.Scotty.Action
模块中进行模拟。我试图模拟页面请求并捕获结果,并模拟通常具有 IO 副作用的页面请求。
具体例子:
-- LibraryPackage.hs
module LibraryPackage (SpecialReader) where
import Control.Monad.Reader
type SpecialReader a = Reader Env a
data Env = Env Int
runSpecialReader r = runReader r (Env 5)
-- Main.hs
import LibraryPackage
main = do
let
r = return 10 :: SpecialReader Int
-- problem here -- cannot construct an `Env`
print $ runReader r (Env 5)