如何使用 Yampa 让随机时间过去
How to let a random amount of time pass with 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 SF
.
中执行 IO
操作
您需要做的是在 SF
之外生成您的号码(或者可能为您的号码生成 generator)并将其作为争论。例如,你可以这样写:
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
. Furthermore, rather than writing your own SF
to use it, you could pass it to something like occasionally
,它每隔一段时间就会产生一次事件。
我正在尝试使用 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 SF
.
IO
操作
您需要做的是在 SF
之外生成您的号码(或者可能为您的号码生成 generator)并将其作为争论。例如,你可以这样写:
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
. Furthermore, rather than writing your own SF
to use it, you could pass it to something like occasionally
,它每隔一段时间就会产生一次事件。