在Classic FRP的最近实现中,例如反应性香蕉,存在事件流和信号,它们是阶梯函数(反应性香蕉称它们为行为,但它们仍然是阶梯函数).我注意到Elm只使用信号,并没有区分信号和事件流.此外,反应性香蕉允许从事件流转变为信号(编辑:并且它可以使用重新作用对行为采取行动'虽然不被认为是良好做法),这意味着理论上我们可以应用所有事件流通过首先将信号转换为事件流,应用然后再次转换,对信号/行为进行组合.因此,鉴于它通常更容易使用并只学习一个抽象,分离信号和事件流的优势是什么?在使用信号和转换所有事件流组合器以对信号进行操作时是否有任何损失?
编辑:讨论非常有趣.我自己讨论的主要结论是,行为/事件源既需要相互递归的定义(反馈),也需要输出依赖于两个输入(一个行为和一个事件源),但只在一个时产生一个动作.他们改变了(<@>).
我想知道是否有OSI的gui应用程序允许在GUI中执行git的交互式rebase的所有功能.我已经调查了大多数可用选项,但找不到具有此功能的选项.
我想在反应香蕉中实施某种类型的事件限制.它应该起作用,如果从最后一个通过的事件到达少于delta秒,则不通过事件.如果它没有通过那么它被存储并在从最后一个被触发的事件开始的delta秒之后被触发.
下面是一个程序,用于为带有时间戳的数字列表实现此功能.是否有可能将其转化为反应性香蕉?
此外,在反应性香蕉中,如何在其他事件进入后x秒发射事件?
module Main where
import Data.List
-- 1 second throtling
-- logic is to never output a value before 1 second has passed since last value was outputed.
main :: IO()
main = print $ test [ (0.0, 1.0), (1.1, 2.0), (1.5,3.0), (1.7,4.0), (2.2, 5.0) ]
--should output [ (0.0, 1.0), (1.1, 2.0), (2.1,4.0), (3.1, 5.0) ]
test :: [(Double,Double)] -> [(Double,Double)]
test list = g v (concat xs)
where
(v, xs) = mapAccumL f (-50,Nothing) list
g … 首先是一个免责声明,我可能完全误解了三便器的工作方式,因为我对Haskell的知识不那么先进,所以我的断言就是一粒盐.:-)
在我看来,一些组合器不是纯粹的,例如
stepper :: MonadIO m => a -> Event a -> m (Behavior a)
Run Code Online (Sandbox Code Playgroud)
步进器是否必然在某种类型的IO monad上运行(因此它不是纯粹的),或者我在这里误解了什么?第二个问题,如果那些组合器确实不合适,那为什么呢?对我来说,这使得构建事件图的代码比反应性香蕉更好,因为必须使用IO monad而不是纯粹的普通函数.代码似乎变得比在反应性香蕉中变得更复杂.
更可怕的是,valueChange似乎是纯粹的类型
valueChange :: Element -> Event String
Run Code Online (Sandbox Code Playgroud)
但它实际上是在内部使用unsafeMapIO,它实际上是在做隐藏的IO吗?同样,我可能会误解某些东西,但这不是Haskell中最严重的罪吗?这也令人困惑,我无法从类型中看出回叫注册是如何发生的......这在我之前从未发生在Haskell中......是否这样做是为了让用户不得不处理Frameworks monad?
触发火灾动作是否安全
(addHandler, fire) <- newAddHandler
Run Code Online (Sandbox Code Playgroud)
从一个不同的线程,编译反应香蕉图?
我正在寻找在reactive-banana中的函数,它将根据另一个事件流或信号的传入值(行为?)选择接下来要发出的事件流.在scala库中,响应式网络可以通过以下方式完成:
flatMap[U](f: T => EventStream[U]): EventStream[U]
Run Code Online (Sandbox Code Playgroud)
谢谢 !
我应该传递给'遍历'(从迭代器模式的本质)的函数是什么,这样我可以根据每个原始元素累积状态,然后根据原始元素和状态到目前为止进行映射.
在'collect'和'disperse'中,只有映射取决于状态,或者状态取决于元素,但不能同时取决于两者.
http://etorreborre.blogspot.co.uk/2011/06/essence-of-iterator-pattern.html上的表似乎表示我应该使用'traverse'但是traverse是实现所有其他功能的函数,所以我有点迷茫.
假设我想从一个文件流到另一个文件,但我想跳过输入文件的前n行.如果没有先使用'fold'折叠整个第一个文件,我该怎么做?
import Turtle
main = output "/tmp/b.txt" (f (input "/tmp/a.txt"))
Run Code Online (Sandbox Code Playgroud)
应该做什么才能实现这一目标?
ps:我没有足够的声誉来创建'haskell-turtle'标签.