在 Haskell 中如何使用两个映射来遍历 2 元组?

jac*_*bsa 2 monads haskell traversal

我有一个m支持以下操作的 monad:

someName :: (t1 -> m u1) -> (t2 -> m u2) -> ((t1, t2) -> m (u1, u2))
Run Code Online (Sandbox Code Playgroud)

用更像英语的方式来说:给定一个可用于将inbind转换为另一个映射的映射,用于另一对类型的映射,返回这两种类型对的映射。m t1m u1

这个概念有名字吗?它对所有 monad 都有明确定义吗?只有一些?没有,我的事实对于我正在研究的事实来说是错误的吗?


这让人想起traverseTraversables 的操作,只不过涉及两个映射。另外,traverse对于 2 元组似乎仅将映射应用于第二个元素:

ghci> f a = Just (a + 1)
ghci> traverse f (0, 1)
Just (0,2)
ghci> traverse f ("Hello", 1)
Just ("Hello",2)
Run Code Online (Sandbox Code Playgroud)

bra*_*drn 6

所有 monad 都有这个操作。事实上,所有的应用函子都有这样的操作:

someName :: Applicative m => (t1 -> m u1) -> (t2 -> m u2) -> ((t1, t2) -> m (u1, u2))
someName f1 f2 = \(t1, t2) -> (,) <$> f1 t1 <*> f2 t2
Run Code Online (Sandbox Code Playgroud)

出于这个原因,我怀疑它有任何特殊的名称,或者除了Applicative更一般的属性之外还有任何有趣的属性。


Dan*_*ner 6

它被称为bitraverse您最喜欢的编译器,并且是您最喜欢的编译器的标准配置。