假设我们想要在Maybe
monad上使用ReaderT [(a,b)]
,然后我们要在列表中进行查找。是否应该将函数包装到单体变压器中被认为是不好的做法?
现在一个简单的,并没有太罕见的方式是这样的:
第一种可能性
find a = ReaderT (lookup a)
但是它似乎像这样断言关于如何ReaderT变压器厂的一些不平凡的事。看看Control.Monad.Reader的源代码很明显,这工作得很好。但是我没有阅读任何支持这一点的文档。然而,我们也可以这样写找到这样的:
第二种可能性
find a = do y <- ask
lift (lookup a y)
类似的想法保持包装MaybeT
,StateT
,State
和Reader
。通常我会写第一个例子,但大多数情况下很明显,如何像第二个例子那样编写它,甚至可以说它更具可读性。所以我的问题是:应该像第一个例子的代码被认为是坏的?
你也可以写`find a = lift。 lookup a =“ask”,与第二个选项一样清晰(恕我直言),但更短。 – 2010-11-30 19:35:14
或使用fmap:find a = fmap(lookup a)ask = lookup a <$> ask – urso 2010-12-01 02:01:32