将函数组合到返回元组的函数

时间:2016-05-22 19:10:35

标签: haskell functional-programming tuples

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)

2 个答案:

答案 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)
相关问题