2013-06-12 14 views
15

Właśnie napisał funkcje takie jak to do map4 tylko dlatego, że wydają się przydatne:Czy jest coś takiego jak `map2 :: (i -> a) -> (i -> b) -> [i] -> [(a, b)]`?

map2 :: Functor f => (i -> a) -> (i -> b) -> f i -> f (a,b) 
map2 f1 f2 = fmap $ \i -> (f1 i, f2 i) 

Przed I nadal map8 pomyślałem, że zapytać, czy istnieje coś podobnego w jakimś standardowym module. Hayoo nie zna żadnej funkcji, która ma podpis powyżej.

Uwaga: Znalazłem już Control.Arrow.&&& co zmniejsza powyższe do:

map2 f1 f2 = fmap (f1 &&& f2) 

Ale nie wydaje się być podobna funkcja dla fanout więcej niż dwa.

Odpowiedz

19

(->) i jest aplikacyjnych funktor, więc można napisać (&&&) jak

f &&& g = (,) <$> f <*> g 

i można napisać map3 jak

map3 f1 f2 f3 = map ((,,) <$> f1 <*> f2 <*> f3) 

wyjątkiem, że to jest nie krótszy niż

map3 f1 f2 f3 = map $ \i -> (f1 i, f2 i, f3 i) 

Ale dzięki wskazówce Gabriela ta to krótszy:

map3 f1 f2 f3 = map (liftA3 (,,) f1 f2 f3) 
+10

Możesz również użyć 'liftA3 (,,)' –

+0

Och, miło! To zdecydowanie lepsze (w sensie mniejszego pisania) niż wtedy. – fho

+0

Oh ... ale 'liftAn' jest zdefiniowane tylko do' n = 3'. Posiadanie składniowego cukru stosowanego w Idrisie byłoby teraz miłe. – fho

12

Nie ma standardowej funkcji dla fanout więcej niż dwa, choć można zasymulować za pomocą zagnieżdżonych krotki:

f :: i -> a 
g :: i -> b 
h :: i -> c 

f &&& g :: i -> (a, b) 

(f &&& g) &&& h :: i -> ((a, b), c) 

Jeśli nie podoba zagnieżdżonych krotki wtedy trzeba będzie napisać tę funkcję siebie:

fanout3 :: (i -> a) -> (i -> b) -> (i -> c) -> i -> (a, b, c) 
fanout3 f g h i = (f i, g i, h i) 

jak wspomniał pan w swoim pytaniu, skoro masz taką funkcję następnie można po prostu map go:

map (fanout3 f g h) :: [i] -> [(a, b, c)] 
+0

Ok ... dzięki :) – fho

+1

Nie ma za co! –

+0

Btw ... czy istnieje coś takiego jak typ "spłaszczania", który konwertuje takie rzeczy jak '(a, (b, c))' na '(a, b, c)' lub '[[[a], a], a] 'to' [a, a, a] '. Jestem świadomy 'concat', ale wydaje się, że istnieje tam wspólna struktura. – fho

Powiązane problemy