【发布时间】:2015-08-13 02:37:48
【问题描述】:
我正在寻找一个类似于以下类型的函数:
Monad m => (a, b) -> (b -> m c) -> m (a, c)
在我看来,它是绑定 (>>=) 和镜头操作的某种组合。
我知道我可以在绑定后通过模式匹配来解决这个问题,但我的直觉告诉我有一种“更简单”的方法可以通过利用镜头来编写它。
有这样的操作吗?
【问题讨论】:
-
您是否有理由要使用镜头操作?使用
do表示法很简单:doit (a,b) func = do { c <- func b; return (a,c) } -
Lenses 出现在我的脑海中,因为我有兴趣从一般意义上解决这个问题——即抽象出形状,在本例中为 2 元组。
-
也许这个 SO 问题会有所帮助:stackoverflow.com/questions/22209982/…
-
不知道我是怎么错过的!我将下面的答案标记为正确,因为它是我所问问题的直接解决方案。不过,您的链接肯定比我希望找到的更多,谢谢!
-
Applicative甚至Functor都不是Monad的超类,直到base 4.8(GHC 7.10)。在去年糟糕的过去,人们不得不使用一种新型包装器将任意 monad 转换为应用程序。
标签: haskell haskell-lens