根据Yampa的公共API定义信号功能,例如“积分”

问题描述

我正在尝试熟悉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

解决方法

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

accompanying repository以我想要的样式显示了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是Doubles的流,那么在读取相应样本后的积分值流i'等于在读取相应样本之前的积分值流加上以下输入元素乘以时间步长(在此公式中固定),并且对于第一个样本计算为0(i,对于随后的init 0而言,积分值i'的流被计算。在扬帕省,init被称为iPre

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...