1

我正在尝试掌握 Yampa,但是从高级信号函数的定义来看,integral对于我来说,如何使用 Yampa 导出的带有惯用 Haskell 的组合器自己定义这样的信号函数对我来说并不明显(我不在乎目前的表现)。我的目标是学习如何编写自己的组合器来进行去抖动、缓冲、分组等。

integral函数使用未导出的构造函数SFSF'. 如何仅使用其他导出的组合器编写它,可能使用带有开关和箭头符号的更惯用的 Yampa 样式?

integral :: VectorSpace a s => SF a a
integral = SF {sfTF = tf0}
    where
        tf0 a0 = (integralAux igrl0 a0, igrl0)

        igrl0  = zeroVector

        integralAux igrl a_prev = SF' tf -- True
            where
                tf dt a = (integralAux igrl' a, igrl')
                    where
                       igrl' = igrl ^+^ realToFrac dt *^ a_prev
4

1 回答 1

0

可以通过查看identityconstantarrPrim等来更改导出版本的未导出构造函数,但我发现采用更通用的方法使用来自 Hai Liu 等人的研究的因果交换箭头更有趣。

随附的存储库显示了integral我想要的样式的实现:

integral :: ArrowInit a => a Double Double
integral = proc x -> do
  rec let i' = i + x * dt
      i <- init 0 -< i'
  returnA -< i

为了理解它,阅读 Hai 的论文对我有所帮助,因为他们举了几个例子。如果我们假设x是一个双精度流,那么i'读取各个样本之后的整数值流等于读取各个样本之前的整数值流加上下面的输入元素乘以时间步长(在这个公式中是固定的) , 并且i对于第一个样本作为 0 ( init 0) 和来自 的后续样本计算整数值流i'。在Yampa,init被称为iPre

于 2020-12-06T11:44:40.317 回答