假设我们想要使用ReaderT [(a,b)]
monad Maybe
,然后我们想要在列表中进行查找。
现在,一个简单且不常见的方法是:
第一种可能性
find a = ReaderT (lookup a)
但是,这似乎确实断言了有关 ReaderT 转换器如何工作的一些不平凡的事情。查看 Control.Monad.Reader 的源代码,很明显这很好用。但我还没有阅读任何支持这一点的文档。但是我们也可以这样写 find:
第二种可能性
find a = do y <- ask
lift (lookup a y)
类似的想法也适用于包装MaybeT
,StateT
和. 通常我会写类似于第一个示例的内容,但大多数情况下,如何编写类似于第二个示例真的很明显,您甚至可能会说它更具可读性。所以我的问题是:像第一个例子这样的代码应该被认为是坏的吗?State
Reader