如何解决根据Yampa的公共API定义信号功能,例如“积分”
我正在尝试熟悉Yampa,但是从integral
这样的高级信号函数的定义中,我不知道如何用Yampa惯用的导出组合器自己定义此类信号函数Haskell(目前我不在乎性能)。我的目标是学习如何编写自己的组合器以进行反跳,缓冲,分组等。
integral
函数由未导出的构造函数SF
和SF'
定义。我该如何仅与其他导出的组合器一起编写它,可能使用带有开关和箭头符号的更惯用的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
解决方法
可以通过查看identity
,constant
,arrPrim
等为导出的版本更改未导出的构造函数,但是我发现采用更通用的使用方法会更有趣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
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。