繁体   English   中英

是否有一系列 Haskell 函数用于对应用元组进行排序?

[英]Is there a family of Haskell functions for sequencing tuples of applicatives?

是否有一个标准的 function 或函数族,用于对应用元组进行排序,作为sequenceA的概括? 像下面这样,除了所有合理的元组长度:

sequence3TupleA :: Applicative f => (f a1, f a2, f a3) -> f (a1, a2, a3)

我相信这应该可以实现(它是为我正在使用的应用程序准备的)。

我从Data.Tuple.Sequence中找到了SequenceT ,但它似乎需要一个 monad,而且它似乎实际上并不包含序列 function(我可能以某种方式误读了文档)。

tuple package 中的SequenceT类型类及其方法sequenceT确实可以满足您的需求。 不幸的是,这个 package 似乎自 2014 年以来就被放弃了,在Applicative类型类被引入之前,所以只适用于Monad实例。 对此进行排序的问题自 2017 年以来一直未解决,相关的拉取请求已被贡献者关闭。

正如@lsmor 在评论中提到的,这个 function 并不难,它的定义是:

sequence3TupleA (a, b, c) = (,,) <$> a <*> b <*> c

元组在 Haskell 中有点“痛苦”,因为类型不是递归的,生成函数需要为所有元组实现它。 有人提议,例如(a, b, c)(a, (b, c))语法糖,并且只有二元组真正存在,或者至少从类型系统的角度来看是这样。 这在某种程度上是HList正在做的事情。

然而, @Ismor描述的模式可以通过模板 Haskell 实现。我发现这个问题非常有趣,并为tuple-append package实现了这个:它定义了一个类型类SequenceTuple ,它实现了一个sequenceTupleAsequenceTupleA_ ,它实现了这些元组的长度62,因为这是元组中元素数量的 GHC 上限,尽管很可能永远不需要使用这么大的元组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM