我写了下面的单子变换器(我相信它们是等价的),即:
newtype MonadReaderT1 r m a = MonadReaderT (ReaderT (r m) m a)
newtype MonadReaderT2 r m a = MonadReaderT (ReaderT (m r) m a)
这样做的目的是,我基本上想要一个ReaderT
,但我的环境必须在Monad内部访问,它实际上不是一个固定的纯值(在我的例子中,它是一个需要定期刷新的auth令牌)。
我之所以认为MonadReaderT1
和MonadReaderT2
是等价的,是因为我可以直接说:
newtype B m = B (m A)
那么MonadReaderT1 B
和MonadReaderT2 A
是一样的。
但我 * 认为 * 我需要这个额外的机械在这里以上和超越我得到的普通旧ReaderT
。
但我感觉我不是第一个这样做或需要这样做的人。我只是重新发明了一种现有的类型吗?如果是这样的话,它是什么?
1条答案
按热度按时间chy5wohz1#
我不确定在这种情况下是否值得定义一个单独的转换器。考虑一下,如果您在
Int
环境中使用读取器转换器,您可能不会觉得需要为这种情况编写一个特殊的转换器:相反,您只需直接使用
ReaderT Int
。类似地,如果你碰巧想要一个monadic动作作为你的环境,我认为你应该直接使用
ReaderT
,将你的monad堆栈定义为一个类型:或新类型:
沿着用于获取令牌的助手:
如果您更喜欢以大量使用
mtl
约束的方式编写,则可以使用类和示例来定义token
:它允许您编写使用通用令牌的一元操作:
而实际上不必定义新的变压器。