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

时间:2014-07-23 14:45:37

标签: haskell tuples sequence monads

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

3 个答案:

答案 0 :(得分:10)

ghci> import Control.Lens
ghci> sequenceOf both (getLine, getLine)
Apples
Bananas
("Apples","Bananas")

答案 1 :(得分:8)

对于所有不同的元组类型,没有一个函数,因为它不会有一个类型。

您可以定义一系列功能,如:

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

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

您还应该看到another answer,表示已经有一个包含此系列函数的库。

答案 2 :(得分:6)

tuple包有Data.Tuple.Sequence.sequenceT,最多可重载15个元组。