【发布时间】:2023-04-10 17:18:01
【问题描述】:
我想在 Haskell 中表示具有以下行为的电路:
电路有两个输入:
- 数据输入
- 和一个开关量输入
和一个输出。
- 当开关=
True则输出t=输入t - 当 switch =
False,输出 t = 输出 t-1
我需要一种表示反馈循环和状态的方法。
我知道有几个库为这类事情提供抽象,但它们对我来说就像魔术一样。
有没有简单的建模方法?
编辑:
type Signal a = [a]
type Input = Signal Int
type Output = Signal Int
type State = Int
type Switch = Signal Bool
delay :: a -> Signal a -> Signal a
delay = (:)
circuit :: State -> Input -> Switch -> Output
circuit s (i:is) (True:bs) = i : circuit i is bs
circuit s (i:is) (False:bs) = s : circuit s is bs
我使用流来表示信号,并在 s 中明确地携带状态。但是,如果我想动态提取(查看)输出流中的元素怎么办?
这看起来像是 State Monad 可以解决的问题,但我找不到表示它的方法。
【问题讨论】:
-
乍一看,这似乎可以解决问题:
circuit switch input t = if switch then input t else input (t-1)...它有 2 个输入,它应该遵守您的法律(当然我假设最后一部分output (t) = output (t-1)是一个错字) -
@Carsten,哦,当然,非常优雅!
-
@Carsten,这不是错字,如果开关关闭,我希望我的电路在给定时间返回之前的输出,以及当前输入(然后将成为新的存储值)当开关打开时。困难在于需要反馈循环和存储状态的方法。
-
抱歉,我误解了您的
t(这显然代表时间) - 但可惜您已经有了一个很好的答案:D -
我不确定您所说的“即时”是什么意思。你的意思是你有一些实时输入? Fwiw 这就是 FRP 的发明目的。
标签: loops haskell sequential feedback circuit