2016-05-22 17 views
5

C'è una funzione nella libreria standard Haskell che prende due funzioni e restituisce una funzione che restituirà i risultati di entrambe queste funzioni in una tupla, qualcosa di simile:Combina funzioni a una funzione che restituisce una tupla

(><) :: (a -> b) -> (a -> c) -> a -> (b, c) 
f >< g = \a -> (f a, g a) 

In modo che:

((+2) >< (+3)) 10 == (12,13) 
((:[1,2,3]) >< (*2)) 5 == ([5,1,2,3],10) 

risposta

12

&&& da Control.Arrow, ha la firma:

(&&&) :: Control.Arrow.Arrow a => a b c -> a b c' -> a b (c, c') 

che è più generico di quello che lei descrive, ma come mostrato here, quando applicato alle funzioni, si risolve a:

(b -> c) -> (b -> c') -> (b -> (c, c')) 

e fa ciò che si descrive:

\> import Control.Arrow ((&&&)) 

\> (+2) &&& (+3) $ 10 
(12,13) 

\> (:[1,2,3]) &&& (*2) $ 5 
([5,1,2,3],10) 
6

utilizzare l'istanza Applicative per le funzioni:

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

per rendere la firma più concreto, specializzati f ad un funzione utilizzando TypeApplications (GHC> = 8):

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

E, con staffe idioma, possiamo solo scrivere '(| f, g |)'. – pigworker