Haskell中是否存在作为sequenceA泛化的应用函子元组序列化标准函数族?
对应用函子元组的泛化sequenceA实现方案
使用
generics-sop库的现成函数
这个库专门处理n元积类型,其中的sequence_TupleOf函数完全满足需求——它只要求Applicative约束,支持任意合理长度的元组。示例代码:import Generics.SOP import Generics.SOP.Tuple -- 针对三元组时,类型签名自动匹配: -- sequenceTupleA :: Applicative f => (f a1, f a2, f a3) -> f (a1, a2, a3) sequenceTupleA :: (ProductType a, Applicative f) => TupleOf f a -> f a sequenceTupleA = sequence_TupleOf这里的
TupleOf f a会自动映射为f包裹元组每个元素的类型,比如当a是(a1,a2,a3)时,TupleOf f a就是(f a1,f a2,f a3),完全贴合你的场景。为什么
Data.Tuple.Sequence不适用
你提到的SequenceT确实依赖Monad约束,这是因为它的实现没有利用Applicative的泛化能力,属于冗余约束,无法适配仅具备Applicative实例的函子。手动基于Generic推导(无需额外库)
如果你不想引入第三方库,也可以借助GHC的Generic类型类手动实现:import GHC.Generics class SeqTuple f g where seqTuple :: g (f ()) -> f (g ()) instance Applicative f => SeqTuple f (K1 i a) where seqTuple (K1 fa) = K1 <$> fa instance (SeqTuple f f1, SeqTuple f f2) => SeqTuple f (f1 :*: f2) where seqTuple (a :*: b) = (:*:) <$> seqTuple a <*> seqTuple b sequenceTupleA :: (Generic t, SeqTuple f (Rep t)) => Rep t (f ()) -> f t sequenceTupleA = fmap to . seqTuple不过这种方式需要自行处理Generic的细节,不如现成库简洁可靠。
内容的提问来源于stack exchange,提问作者jacobsa
相关产品推荐
相关产品推荐

