2015-07-28 3 views

ответ

3

Это должно работать:

import Control.Applicative 

unzipEvent :: Event t (a, b) -> (Event t a, Event t b) 
unzipEvent = liftA2 (,) (fmap fst) (fmap snd) 

Примечания:

  • liftA2 (,) является универсальным, так как он просто используя Applicative экземпляр функций. В этом случае эквивалентной альтернативой этому будет (&&&) от Control.Arrow. Существует также менее причудливая альтернатива, \e -> (fst <$> e, snd <$> e).
  • Даже если Event t был Traversable, sequenceA не помогло бы. Functor и Applicative экземпляры для пар are parametrised only on the second component of the pair. В итоге вы получите результат (a, Event t b), не говоря уже об ограничении Monoid на a.
+0

Спасибо @duplode снова за ваш ответ, также я очень ценю ваши подробные заметки. Я буду искать «Стрелу», поскольку меня это интересует. –

+4

«liftA2 (,)' - это красная селедка, это просто «unzipEvent e = (fst <$> e, snd <$> e)« письменный без помех ». – Cactus

+0

Спасибо @Cactus за более легкое решение! Это был хороший опыт, чтобы следовать типам оригинальной комбинации tho. –

 Смежные вопросы

  • Нет связанных вопросов^_^