有没有办法让 Behavior t [a]
的 [a] 在时间 t 的值是时间 t 包含在 Behavior t [Behavior t a]
中的值?即,具有以下类型的函数:
Behavior t [Behavior t a] -> Behavior t [a]
如果这是不可能的,是因为逻辑上的不可能性还是 react 性香蕉的限制?
最佳答案
该类型对于任何 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)
这适用于任何也是 monad 的
f
:f :: (Monad m, T.Traversable t) => m (t (m a)) -> m (t a)
f = join . liftM T.sequence
一个明显的问题出现了:如果一个应用程序有这样的
f
,它一定是一个 monad 吗?答案是肯定的。我们只是将 f
应用于 Identity
可遍历(单元素集合 - Traversable
的 Identity
实例)并将 join
构造为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
是 Monad
时,您正在寻找的函数才会存在。 因为它不是,所以很可能没有这样的功能。 (我相信如果有办法让它成为一个 monad,它会被包含在库中。)关于haskell - 是否可以? : Behavior t [Behavior t a] -> Behavior t [a],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20876366/