在给定的反应香蕉中,Event t (a, b)
您将如何引导它(Event t a, Event t b)
?
Traversable#sequence
似乎用Monad
for(,)
提供的一些实例来解决它,但Event t
只是Functor
.
在给定的反应香蕉中,Event t (a, b)
您将如何引导它(Event t a, Event t b)
?
Traversable#sequence
似乎用Monad
for(,)
提供的一些实例来解决它,但Event t
只是Functor
.
这应该有效:
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 t
是Traversable
,sequenceA
也无济于事。对的Functor
和Applicative
实例仅在对的第二个组件上进行参数化。你最终会得到一个结果类型,(a, Event t b)
更不用说Monoid
.a