Большинство методов, которые я знаю из списков, на самом деле являются особыми случаями некоторых известных классов типов. Некоторые примеры методов и связанных с классом типа:Что такое обобщение unzip?
map :: (a -> b) -> [a] -> [b]
иFunctor
foldr :: (a -> b -> b) -> b -> [a] -> b
иFoldable
forM :: Monad m => [a] -> (a -> m b) -> m [b]
иTraversable
concat :: [[a]] -> [a]
иMonad
Возможно, этот список можно продолжить (помилования каламбур).
Мне интересно о «более глубоком значении» за unzip :: [(a, b)] -> ([a], [b])
. Может ли он быть реализован с использованием некоторых известных экземпляров []
и, например, экземпляра-функтора (,a)
? Или какие-то другие случаи? В идеале, я бы хотел иметь более абстрактную функцию с этим типом: SomeClass m => unzip :: m (a, b) -> (m a, m b)
. Есть ли класс, который сделает эту работу?
[Data.Align.Unalign] (http://hackage.haskell.org/package/these-0.6.2.1/docs/Data-Align.html#t:Unalign) –
Связанный: «Более глубокое значение» _zip_ является [правильным присоединением] (https://hackage.haskell.org/package/adjunctions-4.3/docs/Data-Functor-Adjunction.html). – Turion