haskell - 如何使用 Yampa 让随机的时间过去
问题描述
我正在尝试使用 Yampa 编写一个简单的 FRP 示例,而不是等待 2 秒(如这里:https ://wiki.haskell.org/Yampa/reactimate )将在一定范围内等待随机时间。我尝试了多种不同的方法来以某种方式将 randomRIO 函数放入信号函数中,但无法真正掌握我应该做什么。我的意图是像这样替换 twoSecondsPassed 函数:
randomTimePassed :: SF () Bool
randomTimePassed = time >>> arr (\x -> x < randomRIO (0, 10))
但这似乎并没有因为类型不匹配而起作用。编译器输出:
* Couldn't match type `m0 a0' with `Double'
Expected: SF Time Bool
Actual: SF (m0 a0) Bool
* In the second argument of `(>>>)', namely
`arr (\ x -> x < randomRIO (0, 10))'
In the expression: time >>> arr (\ x -> x < randomRIO (0, 10))
In an equation for `randomTimePassed':
randomTimePassed = time >>> arr (\ x -> x < randomRIO (0, 10))
任何指向正确方向的指针都将不胜感激,因为我对 Yampa 很陌生,似乎找不到合适的文档来帮助我。
解决方案
的类型randomRIO (0,10)
是(在您使用时专门化)IO Double
,但2
您要替换的类型是简单的Double
。此外,您不能IO
在 yampa 中执行操作SF
。
您需要做的是在外部生成您的号码(或者可能为您的号码生成一个生成器SF
)并将其作为参数传递。例如,您可以编写:
someTimePassed :: Double -> SF () Bool
someTimePassed t = time >>> arr (\x -> x < t)
main = do
t <- getCurrentTime
timeRef <- newIORef t
randTime <- randomRIO (0, 10)
reactimate initialize (sense timeRef) actuate (someSecondsPassed randTime)
如果您需要多个随机数,则需要传递一个随机数生成器。例如,您可以使用getStdGen
. SF
此外,您可以将它传递给类似 的东西,而不是自己编写来使用它,occasionally
它会经常产生事件。
推荐阅读
- dart - 为什么 Dart 没有弄清楚下面代码中的类实例变量
- spring - 如何对 Spring Security 默认 POST“/login”进行单元测试
- python - 同时打印到多行python
- java - Spring XML模型中的XML文本字符串总是被转义 - 如何防止
- r - 如何在“plotly”的子图中分配“x 轴”标题并在“标题”中插入希腊字母“δ”?
- terraform - terraform.tfvars 与 variables.tf 的区别
- javascript - 如何检查数组对象中是否存在元素
- bash - 在外壳(bash)中进行文件老化/保留的明智方法是什么?
- ansible - 如何遍历 Ansible 中的嵌套列表?
- pandas - 如何解决 read_csv 中的 Unicode 错误?