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