3

Behavior t [a]時間 t での [a] の値が時間 t での a に含まれる値であるa を持つ方法はありBehavior t [Behavior t a]ますか? つまり、次のタイプの関数:

Behavior t [Behavior t a] -> Behavior t [a]

これが不可能な場合、それは論理的な不可能性またはリアクティブ バナナの制限によるものですか?

4

2 に答える 2

12

この型は、任意の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し、次のように構築します。IdentityTraversableIdentityjoin

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そうではないので、おそらくそのような機能はありません。(モナドにする方法があれば、ライブラリに含まれると思います。)

于 2014-01-02T08:43:10.473 に答える
2

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はありません。これについては、こちらで説明しています

于 2014-01-03T10:26:23.360 に答える