如何让 Yampa 随机度过一段时光

如何解决如何让 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 .此外,您不能在 yampa IO 中执行 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 之类的东西,它每隔一段时间就会产生事件。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?