Haskell——元组有单子序列函数吗?

Haskell——元组有单子序列函数吗?,haskell,tuples,sequence,monads,Haskell,Tuples,Sequence,Monads,假设我有一个Monad m=>(ma,ma)类型的值,我想对这对值进行“排序”,以创建一个Monad m=>m(a,a)类型的值,该值以与“sequence”函数相同的方式组合两个值的一元上下文。是否有一些标准功能或标准方法来实现这一点?这项行动有意义吗 对于所有不同的元组类型,不会有单一的函数,因为它不会有单一的类型 ghci> import Control.Lens ghci> sequenceOf both (getLine, getLine) Apples Bananas (

假设我有一个
Monad m=>(ma,ma)
类型的值,我想对这对值进行“排序”,以创建一个
Monad m=>m(a,a)
类型的值,该值以与“sequence”函数相同的方式组合两个值的一元上下文。是否有一些标准功能或标准方法来实现这一点?这项行动有意义吗

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

ghci> import Control.Lens
ghci> sequenceOf both (getLine, getLine)
Apples
Bananas
("Apples","Bananas")
您可以定义一系列函数,如:

ts0 = return
ts2 = uncurry $ liftM2 (,)
ts3 = uncurr3 $ liftM3 (,,)
{- ... -}
uncurr3 f (x, y, z) = f x y z
当然,一般来说,序列更好地应用于应用程序而不是monad,这就是为什么它是可遍历类型类的一部分。我相信,可以将同质元组[(a,a,a)而不是(a,b,a)]作为单遍历的实例


您还应该看到哪个表示已经有一个包含此函数族的库。

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

我认为最自然的方法是Sequence'(ma,mb)=(x,y)其中x=head l y=last l=sequence[ma,mb],仅将元组视为长度为2的列表?@C.Quilley使用反勾号在注释
`some code`
中包含内联代码。此外,如果您使用
,也会容易得多用于分离定义:
序列(ma,mb)=(x,y),其中x=头部L;y=最后一个L;L=sequence[ma,mb]
uncurry$liftM2(,)::Monad m=>(m a1,m a2)->m(a1,a2)
你也可以用应用程序来做。我想知道是否存在某种大小的同质元组的单遍历实例。首先:我觉得这是一个非常简单和不寻常的程序,没有库函数;你可以按照博伊德的建议在网上做。第二:如果存在这样一个函数,您可能希望将其归档在
Applicative
下,它类似于
()::Applicative f->f a->f b->f(a,b)
。这个函数不是一个标准的函数,但你经常会发现人们在谈论它,因为
应用程序
实例必须遵守的关联性定律基本上是
a(bc)==(ab)c
(直到同构)。你在这方面打败了我,除了我要说的是更一般的
每个
,而不是
两个
。(就是这样。在这种情况下使用镜头就像用炸药来清除鸽子一样;焰火也可以。@BoydStephenSmithJr。没错,但是
Lens
确实倾向于有一些标准库只用于列表或最好是统一结构的事情的元组版本。@BoydStephenSmithJr。噢,划破制服,
每个
。)>要求元组元素是相同的类型。在这方面,您的答案更好。@BoydStephenSmithJr.True,但如果有很多关于如何使用dynamite敲门的简单解释,一般人会做得更好。(我认为这个类比有点不成立,因为我不提倡一般人群使用TNT,更喜欢谨慎使用烟火。)看看,我发现没有这样的例子,
单函子和
元素的
实例做了错误的事情(忽略第一个元素)以与之兼容。元素实例不是一个真正的问题。单函子实例是一个难题,但我认为重叠实例应该工作,因为(a,a)是比(a,b)更具体的类型。您还可以使用
liftA2
将其推广到
Applicative