有没有办法有一个Behavior t [a]
其中 [a] 在时间 t 的值是 a 中包含的值Behavior t [Behavior t a]
在时间 t?即,具有以下类型的函数:
Behavior t [Behavior t a] -> Behavior t [a]
如果这是不可能的,是因为逻辑上的不可能还是反应式香蕉的限制?
该类型对于任何Applicative
:
{-# LANGUAGE RankNTypes #-}
import Control.Applicative
import Control.Monad
import Data.Functor.Identity
import qualified Data.Traversable as T
f' :: (Applicative f) => f [f a] -> f [a]
f' = const $ pure []
这显然不是你想要的。那么我们来询问一下居住情况
(Traversable t) => Behavior u (t (Behavior u a)) -> Behavior u (t a)
或者更一般地说,我们可以构建哪些应用程序
(T.Traversable t) => f (t (f a)) -> f (t a)
这里适合任何人居住f
这也是一个单子:
f :: (Monad m, T.Traversable t) => m (t (m a)) -> m (t a)
f = join . liftM T.sequence
一个明显的问题出现了:如果一个应用程序有这样的f
,它必须是一个单子吗?答案是yes。我们只需申请f
to the Identity
可遍历(单元素集合 -Traversable
的实例Identity
)并构建join
as
g :: (Applicative m) => (forall t . (T.Traversable t) => m (t (m a)) -> m (t a))
-> (m (m a) -> m a)
g f = fmap runIdentity . f . fmap Identity
因此,我们的函数正是针对那些也是 monad 的应用程序而存在的。
总结一下:您正在寻找的功能当且仅当Behavior
were a Monad
.而且因为不是,很可能没有这样的功能。 (我相信,如果有一种方法可以使其成为 monad,它就会被包含在库中。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)