haskell 无函数依赖的MonadReader

ztyzrc3y  于 2023-08-06  发布在  其他
关注(0)|答案(2)|浏览(143)

在某个库中是否有一个MonadReader版本不具有m -> r的功能依赖性?
如果我有一个需要读取器上下文ABC的函数,并且我想调用一个需要读取器上下文AC的函数,那么似乎我已经将所有的上下文捆绑到一个像(A, B, C)这样的结构中,将它们拆分并在(A, C)中重新组合以传递到另一个函数中。
这似乎违背了约束的一般构成方式。
如果我有一个函数:

  1. f :: (C1 a, C2 a) => a -> a
  2. g :: (C2 a, C3 a) => a -> a

字符串
然后,

  1. h :: (C1 a, C2 a, C3 a) => a -> a
  2. h = g . f


完全没问题。
但如果我尝试:

  1. f :: (MonadReader C1 m, MonadReader C2 m) => m a -> m a
  2. g :: (MonadReader C2 m, MonadReader C3 m) => m a -> m a


然后,

  1. h :: (MonadReader C1 m, MonadReader C2 m, MonadReader C3 m) => m a -> m a
  2. h = g . f


这将是一个伪函数,因为函数依赖性很麻烦。
我知道如果没有函数依赖,ask可能需要类型注解,但在我的情况下,这是一个合理的妥协,特别是当在其他地方简单地使用ask的输出来确定它的类型时。
有没有一个版本的MonadReader没有这个功能依赖?或者我需要自己卷?或者有没有其他方法,而不仅仅是手动分离/组合元组(在这种情况下,我觉得我还不如直接将上下文作为第一个参数显式传递)。

zyfwsgd6

zyfwsgd61#

通过Magnify类型类有lensy stuff for this

  1. magnify :: ((b -> k c b) -> a -> k c a) -> m c -> n c

字符串
使用Getter在比定义一元操作的环境更大的环境中运行一元操作。【例如:】

  1. magnify :: Monoid w => Getter s t -> RWST s w st c -> RWST t w st c


我还开发了effect-stack,作为一种概念验证的替代方法,尽管据我所知,目前完全没有用户-甚至没有我。
如果一个Transformer堆栈包括两个提供给定效果的转换器,MTL并不提供一个清晰的方法来消除哪一个是想要的歧义;总是选择最上面的一个。
这个包提供了消除歧义的工具,而不必被迫选择特定的Transformer堆栈。

zbdgwd5y

zbdgwd5y2#

回答我自己的问题,mtl-unleashed完全符合这里的要求。

相关问题