是否可以创建另一个信号函数实例?(重启它)Haskell

时间:2016-01-03 01:06:38

标签: haskell reactive-programming frp arrows

我将向你展示我的最终问题。

我正在尝试构建一个生成一些wave并显示它的GUI应用程序。

生成声音并完成工作:

lastKarplus :: forall p. Clock p => Double -> SigFun p Double Double
lastKarplus m = proc input -> do
            rec added <- delayLine (m/(rate (undefined :: p)))  -< input + feedback
                feedback <- fb -< added
            outA -< added

是字符串函数的一部分:

string :: Clock c => Int -> SigFun c () Double
string 1 =  proc flag -> do
          out <- lastKarplus2 535.3 <<< burst1 535.3 -< ()
          outA -< out

它产生时变的Double值。它们被馈送到傅里叶变换格式函数,这些数据被输入到我正在显示的图形

有问题的部分:

fftEx :: UISF () ()
fftEx = let graLay = makeLayout (Stretchy 200) (Stretchy 300)
    in proc () -> do
    rec b1value <- withDisplay (button "Reset") -< ()
        b1pressed <- unique -< b1value
        graphData <- fftDataGenerator -< b1pressed
        _ <- realtimeGraph graLay 2 Black -< graphData
    outA -< ()



fftDataGenerator :: UISF  (SEvent Bool) [(Double, Time)]
fftDataGenerator = proc e -> do
            d <- clockedSFToUISF 0.1 $ toFFT $ K.string 1  -< ()
            let (s, fft) = unzip d
                (a1, _) =  unzip s
            outA -< zip a1 fft

此时 fftDataGenerator 信号函数会忽略 b1pressed 事件。但我希望它表现得像这样:

  • 启动程序后不立即启动
  • 事件b1pressed可以从0开始执行信号功能。

我尝试在信号函数中添加状态,这些内容如下: Daniel Winograd-Cort - Effects, Asynchrony, and Choice in Arrowized Functional Reactive Programming第43页,但对我来说太过分了,我不得不说。

即使我能记住功能是否正在运行,它总是归结为从零时开始重新生成波。

我很想知道它是否可能。如果有人想看到这个“代码”的其余部分,我会提供它。

0 个答案:

没有答案