在反应性香蕉中,给定Event t (a, b)
,您如何将其引导至(Event t a, Event t b)
?
Traversable#sequence
似乎通过提供Monad
的{{1}}实例来解决此问题,但(,)
仅为Event t
。
答案 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 t
,Traversable
也无济于事。对are parametrised only on the second component of the pair的sequenceA
和Functor
个实例。您最终会得到Applicative
结果类型,更不用说(a, Event t b)
上的Monoid
约束。