2016-05-22 55 views
5

是否有這需要兩個函數,返回它會返回一個元組的這兩個功能的結果的功能,像這樣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) 

回答

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) 
6

使用Applicative實例對於功能:

ghci> :t liftA2 (,) 
liftA2 (,) :: Applicative f => f a -> f b -> f (a, b) 

爲了使簽名更加具體,我們專門將f改爲函數使用TypeApplications(GHC> = 8):

ghci> :set -XTypeApplications 
ghci> :t liftA2 @((->) _) (,) 
liftA2 @((->)_) (,) :: (t -> a) -> (t -> b) -> t -> (a, b) 
+1

並且,對於成語括號,我們可以只寫'(| f,g |)'。 – pigworker