在某个库中是否有一个MonadReader
版本不具有m -> r
的功能依赖性?
如果我有一个需要读取器上下文A
、B
和C
的函数,并且我想调用一个需要读取器上下文A
和C
的函数,那么似乎我已经将所有的上下文捆绑到一个像(A, B, C)
这样的结构中,将它们拆分并在(A, C)
中重新组合以传递到另一个函数中。
这似乎违背了约束的一般构成方式。
如果我有一个函数:
f :: (C1 a, C2 a) => a -> a
g :: (C2 a, C3 a) => a -> a
字符串
然后,
h :: (C1 a, C2 a, C3 a) => a -> a
h = g . f
型
完全没问题。
但如果我尝试:
f :: (MonadReader C1 m, MonadReader C2 m) => m a -> m a
g :: (MonadReader C2 m, MonadReader C3 m) => m a -> m a
型
然后,
h :: (MonadReader C1 m, MonadReader C2 m, MonadReader C3 m) => m a -> m a
h = g . f
型
这将是一个伪函数,因为函数依赖性很麻烦。
我知道如果没有函数依赖,ask
可能需要类型注解,但在我的情况下,这是一个合理的妥协,特别是当在其他地方简单地使用ask
的输出来确定它的类型时。
有没有一个版本的MonadReader
没有这个功能依赖?或者我需要自己卷?或者有没有其他方法,而不仅仅是手动分离/组合元组(在这种情况下,我觉得我还不如直接将上下文作为第一个参数显式传递)。
2条答案
按热度按时间zyfwsgd61#
通过
Magnify
类型类有lensy stuff for this。字符串
使用Getter在比定义一元操作的环境更大的环境中运行一元操作。【例如:】
型
我还开发了effect-stack,作为一种概念验证的替代方法,尽管据我所知,目前完全没有用户-甚至没有我。
如果一个Transformer堆栈包括两个提供给定效果的转换器,MTL并不提供一个清晰的方法来消除哪一个是想要的歧义;总是选择最上面的一个。
这个包提供了消除歧义的工具,而不必被迫选择特定的Transformer堆栈。
zbdgwd5y2#
回答我自己的问题,mtl-unleashed完全符合这里的要求。