Haskell - 元组是否有monad序列函数?

Bil*_*l M 5 monads haskell tuples sequence

假设我有一个类型的值Monad m => (m a, m a),我想"序列"该对以创建一个类型Monad m => m (a, a)的值,它以"序列"函数的相同方式组合两个值的monadic上下文.这样做有一些标准功能或标准方式吗?这项操作甚至有意义吗?

Tom*_*lis 10

ghci> import Control.Lens
ghci> sequenceOf both (getLine, getLine)
Apples
Bananas
("Apples","Bananas")
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下使用镜头感觉就像使用炸药来清除鸽子; 烟花也会做的. (3认同)
  • @BoydStephenSmithJr.是的,但是`lens`*确实*倾向于拥有标准库仅用于列表或最佳统一结构的几个东西的元组版本. (3认同)
  • 你只是打败了我,除了我要说的更通用的'each`而不是'both`.(这是[sequenceOf的例子](http://hackage.haskell.org/package/lens-4.3/docs/Control-Lens-Traversal.html#v:sequenceOf). (2认同)
  • @BoydStephenSmithJr.没错,但是如果有很多关于如何使用炸药敲击的简单解释,一般人群会变得更好.(我认为这个类比在我不提倡使用TNT的一般人群的意义上分解了一点,并且更喜欢谨慎使用烟花.) (2认同)

Boy*_*Jr. 8

对于所有不同的元组类型,不会有单个函数,因为它不具有单个类型.

您可以定义一系列函数,例如:

ts0 = return
ts2 = uncurry $ liftM2 (,)
ts3 = uncurr3 $ liftM3 (,,)
{- ... -}
uncurr3 f (x, y, z) = f x y z
Run Code Online (Sandbox Code Playgroud)

当然,序列通常更适用于applicative而不是monad,这就是为什么它是Traversable类型类的一部分.我相信,有可能使同质元组[(a,a,a)而不是(a,b,a)]成为MonoTraversable的一个实例.

您还应该看到另一个答案,表明已经有一个包含此系列函数的库.

  • 你也可以用`liftA2`将它概括为`Applicative`. (2认同)

aug*_*tss 6

元组包已经Data.Tuple.Sequence.sequenceT被重载到15元组.