作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我有一个项目,我认为学习起来很简单,但又足够复杂,很有趣,我想使用 Happstack 库来编写。在最基本的层面上,这个项目只是一个花哨的文件服务器,带有一些特定于域的 REST 方法(或者其他什么,我真的不在乎它是否真的是 RESTful)来搜索和获取所述文件和元数据。由于我现在也在尝试真正学习 monad 转换器,因此我认为这将是一个完美的学习项目。但是,我在启动它时遇到了一些困难,特别是在如何构建我的变压器堆栈方面。
现在,我只担心几件事:配置、错误报告、状态和日志记录,所以我从
newtype MyApp a = MyApp {
runMyApp :: ReaderT Config (ErrorT String (StateT AppState IO)) a
} deriving (...)
ServerPartT
为了与 Happstack 交互,因此
runMyApp :: ReaderT Config (ErrorT String (StateT AppState (ServerPartT IO))) a
FilterMonad
为它实现,以便使用像
dir
这样的方法,
path
, 和
ok
,但我不知道如何为这种类型实现它。我只需要它将过滤器传递给底层的 monad。有人可以给我一些关于如何实现这个明显至关重要的类型类的指示吗?或者,如果我只是在做一些非常错误的事情,请引导我朝着正确的方向前进。我只关注 Happstack 几天,变形金刚对我来说还是很陌生。我认为我对它们的了解足以使它们变得危险,但我对它们的了解还不够,以至于我可以自己实现一个。非常感谢您提供的任何帮助!
最佳答案
对你来说最简单的事情就是从你的堆栈中删除 ErrorT。如果你看 here您可以看到 Happstack 为 StateT 和 ReaderT 定义了 FilterMonad 的内置 passthrough 实例,但没有为 ErrorT 定义。如果您真的想将 ErrorT 保留在您的堆栈中,那么您需要为它编写一个直通实例。它可能看起来很像 ReaderT 的那个。
instance (FilterMonad res m) => FilterMonad res (ReaderT r m) where
setFilter f = lift $ setFilter f
composeFilter = lift . composeFilter
getFilter = mapReaderT getFilter
runErrorT
轻松地投入其中。围绕该部分,然后使用
ErrorT
,
lift
, 和
return
如所须。此外,变压器堆栈中的额外层会在每次绑定(bind)时增加性能税。因此,虽然 monad 转换器的可组合性非常好,但当性能是一个重要考虑因素时,您通常希望谨慎使用它们。
关于haskell - 学习 Happstack 和 Monad 变形金刚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17334877/
我是一名优秀的程序员,十分优秀!