一种选择是使用元组-同质-h98 https://hackage.haskell.org/package/tuples-homogenous-h98-0.1.1.0包,它为具有适当的同构元组提供新类型包装器Applicative
实例:
GHCi> import Data.Tuple.Homogenous
GHCi> import Control.Applicative
GHCi> liftA2 (+) (Tuple2 (1,2)) (Tuple2 (3,4))
Tuple2 {untuple2 = (4,6)}
GHCi> (>) <$> Tuple3 (7,4,7) <*> Tuple3 (6,6,6)
Tuple3 {untuple3 = (True,False,True)}
如果您有一个最喜欢的同质元组/固定大小向量/固定大小列表库,而不是元组-同质-h98,很可能它也会有合适的ZipList
-like Applicative
实例。
对于配对时对此事的看法略有不同,您可能需要考虑Data.Biapplicative https://hackage.haskell.org/package/bifunctors-5.5.2/docs/Data-Biapplicative.html from 双函子:
GHCi> import Data.Biapplicative
GHCi> bimap (+) (+) (1,2) <<*>> (3,4)
(4,6)
这种方法的一个好处是它可以处理异构对:
GHCi> bimap (+) (+) (1,2.5) <<*>> (3,4)
(4,6.5)
GHCi> bimap (+) (++) (1,"foo") <<*>> (3,"bar")
(4,"foobar")