Haskell标准库中是否有一个函数,该函数接受两个函数并返回一个函数,该函数将在元组中返回这两个函数的结果,如下所示:
(><) :: (a -> b) -> (a -> c) -> a -> (b, c)
f >< g = \a -> (f a, g a)
那样:
((+2) >< (+3)) 10 == (12,13)
((:[1,2,3]) >< (*2)) 5 == ([5,1,2,3],10)
答案 0 :(得分:12)
Control.Arrow
的 &&&
已签名:
(&&&) :: Control.Arrow.Arrow a => a b c -> a b c' -> a b (c, c')
比你描述的更通用,但如图所示here,当应用于函数时,它解析为:
(b -> c) -> (b -> c') -> (b -> (c, c'))
它完成了你描述的内容:
\> import Control.Arrow ((&&&))
\> (+2) &&& (+3) $ 10
(12,13)
\> (:[1,2,3]) &&& (*2) $ 5
([5,1,2,3],10)
答案 1 :(得分:6)
使用Applicative
实例进行功能:
ghci> :t liftA2 (,)
liftA2 (,) :: Applicative f => f a -> f b -> f (a, b)
为了使签名更具体,我们使用f
(GHC&gt; = 8)将TypeApplications
专门化为函数:
ghci> :set -XTypeApplications
ghci> :t liftA2 @((->) _) (,)
liftA2 @((->)_) (,) :: (t -> a) -> (t -> b) -> t -> (a, b)