- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有没有办法对在 react 香蕉中创建的网络进行单元测试?假设我已经建立了一些带有一些输入事件的网络 - 是否可以验证事件已经产生了一些输出流/行为在一定数量的输入事件之后具有一些值(value)。这样做是否有意义?
我注意到有各种interpret*
功能,但似乎无法弄清楚如何使用它们。还有Model
看起来非常适合测试但与实际实现具有完全不同类型的模块。
最佳答案
当你说“单元测试”时,我想象的是 QuickCheck
,您将许多输入注入(inject)网络并检查输出。为了做这样的事情,我们需要一个函数:
evalNetwork :: Network a b -> [a] -> IO [b]
interpret*
之一的变体。具有类似类型的功能,用于特定类型的“网络”。
reactive-banana
网络类型
reactive-banana
中使用的“整个网络”的实际类型不兼容。 .对比涉及网络的实际函数的类型:
compile :: (forall t. Frameworks t => Moment t ()) -> IO EventNetwork
forall t. Frameworks t => Moment t ()
.没有类型变量;没有输入或输出。同样,
EventNetwork
类型没有参数。这告诉我们所有的输入和输出都是通过
IO
中的副作用处理的。 .这也意味着实际上不可能有类似的功能
interpret? :: EventNetwork -> [a] -> IO [b]
a
和
b
是?
reactive-banana
设计的一个重要方面.例如,它使编写与命令式 GUI 框架的绑定(bind)变得容易。
reactive-banana
的魔力就是将所有副作用改组,正如文档所说,“一个单一的、巨大的回调函数”。
Arithmetic
example , 其中
bInput1
和
bInput2
都是使用实际输入小部件构建的,并且输出绑定(bind)到
output
,另一个小部件。
pipes-concurrency
的绑定(bind)。 .我没有听说有人这样做。
inA
和
inB
, 和一个
out
类型的输出,也许你可以写一个像
logic :: Event t inA -> Event t inB -> Behavior t out
interpretFrameworks
一起使用的正确类型:
interpretFrameworks :: (forall t. Event t a -> Event t b) ->
[a] -> IO [[b]]
Event
使用
split
(或者更确切地说,将输入分成
Event
所需的两个
logic
)。现在您将拥有
logic' :: Event t (Either inA inB) -> Behavior t out
.
Behavior
到
Event
.在 0.7 版中,
changes
Reactive.Banana.Frameworks
中的函数有类型
Frameworks t => Behavior t a -> Moment t (Event t a)
,您可以用它来解开
Behavior
,尽管您必须在
Moment
中执行此操作单子(monad)。然而,在 0.8 版中,
a
被包装为
Future a
, 其中
Future
是未导出的类型。 (有一个
issue on Github re exporting Future
。)
Behavior
的最简单方法可能只是重新实现
interpretFrameworks
与适当的类型。 (注意它返回一个包含初始值和后续值列表的元组。)即使
Future
没有导出,可以使用它的
Functor
实例:
interpretFrameworks' :: (forall t. Event t a -> Behavior t b)
-> [a] -> IO (b, [[b]])
interpretFrameworks' f xs = do
output <- newIORef []
init <- newIORef undefined
(addHandler, runHandlers) <- newAddHandler
network <- compile $ do
e <- fromAddHandler addHandler
o <- changes $ f e
i <- initial $ f e
liftIO $ writeIORef init i
reactimate' $ (fmap . fmap) (\b -> modifyIORef output (++[b])) o
actuate network
bs <- forM xs $ \x -> do
runHandlers x
bs <- readIORef output
writeIORef output []
return bs
i <- readIORef init
return (i, bs)
mvc
或 Ertugrul Söylemez 的
netwire
.
mvc
要求您将程序逻辑编写为有状态但其他方面纯的
Pipe a b (State s) ()
, 和
netwire
网络的类型为
Wire s e m a b
;在这两种情况下,类型
a
和
b
公开网络的输入和输出。这使您可以轻松测试,但排除了
reactive-banana
提供的“内联”GUI 绑定(bind)。 .这是一个权衡。
关于haskell - 在 react 香蕉中进行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27216295/
我正在开发一个基于终端的小型 UI,我想使用 Reactive Banana 来描述交互。我唯一感兴趣的外部事件是用户是否按下了某个键。 根据我从 Frameworks 文档中收集到的信息,我可以使用
我需要创建一些自定义滚动动画 - 并想开始探索为一个简单的 block 制作动画。 使用 json - 我想提供 block 的骨架(类名、高度、宽度、背景),然后是与滚动值相关的每个开始/结束帧的
Android 比较 2 个图像以使用位图代码并告诉水果类别是水果(苹果/香蕉)还是不是水果。 我有问题与 Bitmap 和 BitmapFactory 比较有运行时错误,我有问题的解决方案。 act
我目前正在尝试通过 Heinrich Apfelmus 的 reactive-banana 了解 FRP ,与我看过的其他库相比,它似乎是一个文档齐全且简单的库。 但是,我无法理解 AddHandle
我有一个基于 Reactive Banana 的界面 (WX)。现在我对如何真正管理状态有不同的问题: 我应该将状态视为我在代码中定义的行为吗? 如果状态也依赖于外部“事件”,那么不仅仅与 GUI 相
假设我有一个事件触发器,我想在触发时做两件事。首先,我希望它更新某些行为的值。其次,如果满足其他条件,我希望它使用行为的更新值触发另一个事件 send_off 。以代码形式表达,假设我有 trigge
我尝试更改处理器中的 GPIO 数据(不使用 wiringPI 库) int fd = open ("/dev/mem", O_RDWR | O_SYNC); unsigned long* gpio1
从这里的上一个问题开始: Reactive Banana: how to use values from a remote API and merge them in the event stream
我正在考虑类似gnugo的东西的ascii接口(interface)。我认为轮流是一对共同进化(允许用户输入的单子(monad))流。这让我隐约想起了管道。 我不太确定如何使用现有的库来做到这一点。
我想检索小部件值。 在下面,按下按钮 b 检索 s_in 并在 native wxhaskell 中打印它。 b >= putStrLn] 我喜欢在 react-banana 上做同样的事情,但在下面
我在 WX 界面中使用 Reactive-Banana。当按下按钮时,我需要从外部服务 API 检索值。 我有一个基于数据类型AppState的通用Behavior,它根据函数转换(doSomeTra
在 reactive-banana a -> Maybe a -> Maybe a -> Bool -> Event t b -> Event t c -> Behavior t
嗨,我正在尝试安装(无需更新或安装最新的编译器),reactive-banana-wx 和要求之一失败 cabal install reactive-banana-wx 这是错误 Configurin
我是一名优秀的程序员,十分优秀!