2016-05-22 24 views
5

Czy istnieje funkcja w Haskell standardowej biblioteki, która zajmuje dwie funkcje i zwraca funkcję, która zwróci wyniki obu tych funkcji w krotki, coś takiego:Kombajny funkcji do funkcji, która zwraca krotki

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

więc, że:

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

Odpowiedz

12

&&& z Control.Arrow ma podpis:

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

który jest bardziej ogólne niż to, co można opisać, ale jak pokazano here, gdy stosuje się do funkcji, to postanawia:

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

i robi to, co można opisać:

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

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

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

Użyj instancji Applicative dla funkcji:

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

Aby podpis był bardziej konkretny, wyspecjalizowaliśmy się w f Funkcja użyciu TypeApplications (GHC> = 8):

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

I ze wspornikami idiom, możemy tylko napisać '(| f, g |)'. – pigworker