gpt4 book ai didi

haskell - 是否可以? : Behavior t [Behavior t a] -> Behavior t [a]

转载 作者:行者123 更新时间:2023-12-02 20:01:54 26 4
gpt4 key购买 nike

是否有办法获得一个 Behavior t [a],其中时间 t 时 [a] 的值是 Behavior t [Behavior t a] 中包含的值> 在时间 t?即,具有以下类型的函数:

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

如果这是不可能的,是因为逻辑上的不可能性还是响应式(Reactive)香蕉的限制?

最佳答案

该类型对于任何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 同时也是一个 monad 时都会出现这种情况:

f :: (Monad m, T.Traversable t) => m (t (m a)) -> m (t a)
f = join . liftM T.sequence

出现一个明显的问题:如果一个应用程序有这样的 f,它是否必须是一个 monad?答案是。我们只需将 f 应用于 Identity 可遍历(单元素集合 - IdentityTraversable 实例)并构造加入

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 的应用程序而存在的。

结论:当且仅当 BehaviorMonad 时,您正在寻找的函数才会存在。因为它不是,很可能没有这样的功能。 (我相信,如果有一种方法可以使其成为 monad,它就会被包含在库中。)

关于haskell - 是否可以? : Behavior t [Behavior t a] -> Behavior t [a],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20876366/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com