Wytrzeźwiałem, sprawdziłem dla trzech argumentów i się zdegustowałem. I teraz jestem zdegustowaną istotą:
Jest TypeClassa Zip w Data.NonEmpty.Class Apbo nawet cały zbiór TypeClass Zip, Zip3, Zip4 w ClassyPrelude
zip :: Zip f => f a -> f b -> f (a, b)
zip3 :: Zip f => f a -> f b -> f c -> f (a, b, c)
zip4 :: Zip f => f a -> f b -> f c -> f d -> f (a, b, c, d)
są też odpowiednie metody zipWith:
zipWith :: (a -> b -> c) -> f a -> f b -> f c
zipWith3 :: Zip f => (a -> b -> c -> d) -> f a -> f b -> f c -> f d
zipWith4 :: Zip f => (a -> b -> c -> d -> e) -> f a -> f b -> f c -> f d -> f e
Jak na to patrzę to zipWith
jest lepszą nazwą na liftA2
, czyli w heirarchi dziedziczenia między Funktorem a Aplikatywą powinien być jeszcze Zip (Zip to Aplikatywa bez metody pure
:D ).
Co ciekawe w ClassyPrelude Aplikatywa nie dziedziczy z Zip, może coś źle rozumiem
Update to ejst bardziej pokręcone. Czytam [Programowanie Funkcyjne dla Śmiertelników] i tam Aplikatywa dziedziczy z Apply, ale Zip jest gdzieś bokiem