Behavior t [a]
時間 t での [a] の値が時間 t での a に含まれる値であるa を持つ方法はありBehavior t [Behavior t a]
ますか? つまり、次のタイプの関数:
Behavior t [Behavior t a] -> Behavior t [a]
これが不可能な場合、それは論理的な不可能性またはリアクティブ バナナの制限によるものですか?
Behavior t [a]
時間 t での [a] の値が時間 t での a に含まれる値であるa を持つ方法はありBehavior t [Behavior t a]
ますか? つまり、次のタイプの関数:
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
これは、モナドでもあるany に対して居住しています。
f :: (Monad m, T.Traversable t) => m (t (m a)) -> m (t a)
f = join . liftM T.sequence
明らかな疑問が生じます: Applicative がそのような を持つ場合、f
それはモナドでなければならないのでしょうか? 答えはイエスです。traversable (1 つの要素のコレクション - のインスタンス)に適用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
したがって、私たちの関数は、モナドでもあるアプリカティブのために正確に居住しています。
結論:探している関数は、 である場合にのみ存在しBehavior
ますMonad
。そうではないので、おそらくそのような機能はありません。(モナドにする方法があれば、ライブラリに含まれると思います。)
Petr がすでに示したように、そのような関数は
flatten :: Behavior t [Behavior t a] -> Behavior t [a]
Behavior t
型がモナドである場合にのみ存在します。
これを直接見る方法は次のとおりです。
join :: Behavior t (Behavior t a) -> Behavior t a
join = map head . flatten . map (:[])
flatten = join . map sequence
ただし、さまざまな理由から、リアクティブ バナナのモナドでBehavior t
はありません。これについては、こちらで説明しています。