1

在给定的反应香蕉中,Event t (a, b)您将如何引导它(Event t a, Event t b)

Traversable#sequence似乎用Monadfor(,)提供的一些实例来解决它,但Event t只是Functor.

4

1 回答 1

3

这应该有效:

import Control.Applicative

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

笔记:

  • liftA2 (,)是通用的,因为它只是使用Applicative函数的实例。在这种情况下,它的等效替代方案是(&&&)from Control.Arrow。还有一个不那么花哨的选择,\e -> (fst <$> e, snd <$> e).
  • 即使Event tTraversablesequenceA也无济于事。对的FunctorApplicative实例仅在对的第二个组件上进行参数化。你最终会得到一个结果类型,(a, Event t b)更不用说Monoid.a
于 2015-07-28T08:34:42.217 回答