将元组2的事件流解压缩为两个流

时间:2015-07-28 07:54:02

标签: haskell reactive-banana

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

Traversable#sequence似乎通过提供Monad的{​​{1}}实例来解决此问题,但(,)仅为Event t

1 个答案:

答案 0 :(得分:3)

这应该有效:

import Control.Applicative

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

注意:

  • liftA2 (,)是通用的,因为它只是使用Applicative函数实例。在这种情况下,(&&&)的{​​{1}}等效替代它。还有一个不那么花哨的选择,Control.Arrow
  • 即使\e -> (fst <$> e, snd <$> e)Event tTraversable也无济于事。对are parametrised only on the second component of the pairsequenceAFunctor个实例。您最终会得到Applicative结果类型,更不用说(a, Event t b)上的Monoid约束。