gpt4 book ai didi

haskell - ifB 在reactive-banana 中的实现

转载 作者:行者123 更新时间:2023-12-01 00:34:05 26 4
gpt4 key购买 nike

我正在阅读 Conal Elliot 的论文 "Declarative Event-Oriented Programming"它的示例是使用 Fran 库编写的,该库现已过时。

在我学习 FRP 时,我尝试使用响应式(Reactive)香蕉来实现这些示例。我似乎对此没有问题(但必须考虑 很多 :))。我唯一不明白的是如何正确翻译 Fran 的 ifB .

它似乎具有这种类型签名:

ifB :: Behavior Bool -> Behavior a -> Behavior a -> Behavior a

但是reactive-banana 只有 switchB对于这种事情。

目前我设法通过添加一个额外的“触发”事件来实现它,该事件将用于切换行为,如下所示:
ifB :: MonadMoment m => Event b -> BoolB -> Behavior a -> Behavior a -> m (Behavior a)
ifB trigger condB b1 b2 = switchB b2 (switcherB <@ trigger)
where switcherB = (\x -> if x then b1 else b2) <$> condB

我不确定这是否是一个正确且好的解决方案。它有性能吗?
以下是使用 ifB 的论文的片段。 :
editCPoint :: User -> S.Point2 -> CPoint
editCPoint u p0 = (pos, closeEnough)
where
pos, lastRelease :: Point2B
-- vvv this is the ifB in question!
pos = ifB grabbing (mouse u) lastRelease
lastRelease = stepper p0 (release ‘snapshot_‘ pos)

closeEnough, grabbing :: BoolB
closeEnough = distance2 pos (mouse u) <* grabDistance
grabbing = stepper False (grab -=> True .|. release -=> False)

grab, release :: Event ()
grab = lbp u ‘whenE‘ closeEnough
release = lbr u ‘whenE‘ grabbing

grabDistance :: RealB
grabDistance = 2 * pointSize

通过使用我对 ifB 的实现,我设法让这个代码片段与 react-banana 一起工作。并喂它 cursor move事件,因此它会定期更新。我试图仅将鼠标按下/释放事件作为切换触发器提供给它,但它无法正常工作......

我做错了吗?关于如何做得更好的任何建议?

最佳答案

Behavior有一个 Applicative实例,这足以实现 ifB没有动态切换:

ifB :: Behavior Bool -> Behavior a -> Behavior a -> Behavior a
ifB bB bT bF = (\b t f -> if b then t else f) <$> bB <*> bT <*> bF

或者,使用 bool来自 Data.Bool :
ifB :: Behavior Bool -> Behavior a -> Behavior a -> Behavior a
ifB bB bT bF = bool <$> bF <*> bT <*> bB

关于haskell - ifB 在reactive-banana 中的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42327241/

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