gpt4 book ai didi

haskell - FRP中的“Behavior now”

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

在上一个SO问题(Is it possible?: Behavior t [Behavior t a] -> Behavior t [a])中,我们正在分析Behavior join(使用reactive-banana术语)的存在。

Behavior t (Behavior t a) -> Behavior t a

在语义模型中实现如下
type Behavior t a = t -> a

behaviorNow :: Behavior t (Behavior t a) -> Behavior t a
behaviorNow f t = f t t

虽然直接实现这一点很不幸,因为我们可以使用 BehaviorMonad生成 const behaviorNow,以及 behaviorNow是否违反了FRP的语义?

我很想听听使用任何其他FRP系统术语的答案以及有意义的比较。

最佳答案

在基于轮询的FRP系统中,任何行为都具有有意义的join

  • join bb的样本是通过对b进行采样而获得的bb的样本

  • 在基于推式的FRP中,作为由其他步骤函数组成的步骤函数的任何行为都具有有意义的 >>=join。通过 >>=推送值可以用命令式来描述:
  • 当绑定(bind)的参数更改时,评估bind和
  • 将当前步进函数更改为返回的步进函数
  • 将值更改为当前步进函数
  • 的值
  • 当前步函数的值更改时,更改值

  • 提供 Monad实例可能有点不受欢迎,因为即使效率较低,也有可能由库用户根据喜好选择它。例如,使用 >>=构建计算时, this unrelated answer中的代码比使用 <*>构建计算时要执行更多的工作。

    Conal Elliott用声明性术语描述了一个 join,用于同时推送和轮询从步骤函数构建的行为的值:
    -- Reactive is a behavior that can only be a step function
    data Reactive a = a `Stepper` Event a
    newtype Event a = Ev (Future (Reactive a))

    join :: Reactive (Reactive a) -> Reactive a
    join ((a `Stepper` Ev ur) `Stepper` Ev urr ) =
    ((`switcher` Ev urr ) <$> ur) _+_ (join <$> urr )

    switcher :: Reactive a -> Event (Reactive a) -> Reactive a
    r `switcher` er = join (r `Stepper` er)

    其中 Future是我们尚未看到的值的类型, _+_是出现的两种 Future可能性中的第一种, <$>fmap上的缀 Future[1]

    如果我们不提供其他任何行为创建方式,
  • 常数函数(通常是一个步进函数)
  • 一个“步进器”,可记住事件
  • 的最新值
  • 行为本身不随时间变化的各种行为组合器的应用

  • 那么每个行为都是一个步进函数,我们可以将此行为或类似的 Monad实例用于行为。

    只有当我们希望行为是连续的或者是某个时间的函数而不是事件发生时,才会出现困难。考虑一下我们是否有以下情况
    time :: Behavior t t

    这是跟踪当前时间的行为。用于轮询系统的 Monad实例仍然是相同的,但是我们无法再可靠地将更改推入整个系统。当我们制作像 time >>= \x -> if am x then return 0 else return 1这样简单的东西(早上的时间 am t是正确的)时会发生什么?我们上面对 >>=的定义或Elliot的 join都不能接受对时间变化的了解的优化。它不断变化。我们可以对 >>=做的最好的事情是:
  • 如果我们知道绑定(bind)的参数是步进值,则
  • 当绑定(bind)的参数更改时,评估bind和
  • 将当前步进函数更改为返回的步进函数
  • 将值更改为当前步进函数
  • 的值
  • 当前步函数的值更改时,更改值
  • 否则
  • 返回此>>=的抽象语法树

  • 对于 join形式,我们将简化为做类似的事情,并在 join中的外部行为不是阶跃函数的情况下简单地记录AST。

    此外,无论是否引发任何其他事件,使用此内容作为输入构建的任何内容都可能在中午和午夜发生变化。从那时起,它将无法可靠地推送事件,从而污染一切。

    从实现的角度来看,我们最好的选择似乎是连续轮询 time,并使用根据轮询事件构建的步进器替换它所使用的任何位置。这不会在事件之间更新值,因此我们库的用户现在无法可靠地轮询值。

    我们实现的最佳选择是保留此类任意行为发生时的抽象语法树,并且不提供从行为生成事件的方法。然后可以对行为进行轮询,但是不会为它们推送任何更新。在这种情况下,我们最好将其保留在库之外,让用户传递AST(他们可以通过 Free获得),并让用户在每次轮询时评估整个AST。我们无法再为库用户优化它,因为类似这样的任何值都可以连续变化。

    最后一个选择是,它涉及很多复杂性。介绍连续变化值的属性和连续变化值的计算的可预测性的概念。这将使我们能够为较大的时变行为子集提供Monad接口(interface),但不能为所有这些行为提供Monad接口(interface)。这种复杂性在程序的其他部分已经很理想,但是我不知道符号数学之外的任何库都试图解决这个问题。

    关于haskell - FRP中的“Behavior now”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20890439/

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