fay*_*lin 1 haskell loops feedback circuit sequential
我想在Haskell中表示具有以下行为的电路:
该电路有两个输入:
和一个输出.
True然后输出t =输入tFalse,输出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
Run Code Online (Sandbox Code Playgroud)
我使用流来表示信号,并且我在s中明确地携带状态.但是如果我想在运行中提取(查看)输出流中的元素呢?
看起来状态Monad会解决这个问题,但我找不到代表它的方法.
对于它的价值:这个问题非常适合Haskell的一些独特而强大的抽象,比如Monad和Arrow.但是那些花时间和经验来学习,我猜你的措辞是你对它们不是很熟悉.如果你留在Haskell,我建议将来再次重新审视这个问题以获得启示.我不会花更多的时间在这些事情上.
您可以通过无限列表模拟离散时变信号:
type Signal a = [a]
zeroS, oneS :: Signal Bool
zeroS = repeat False
oneS = repeat True
Run Code Online (Sandbox Code Playgroud)
您可以使用逐点组合信号zipWith.例如:
andS :: Signal Bool -> Signal Bool -> Signal Bool
andS = zipWith (&&)
ghci> andS zeroS oneS
[False,False,False,False,False,False,False,False,...
Run Code Online (Sandbox Code Playgroud)
您可以通过列表开头的信号将信号延迟1个单位时间.这需要信号的初始值.
delay :: a -> Signal a -> Signal a
delay x s = x : s
-- or just
-- delay = (:)
Run Code Online (Sandbox Code Playgroud)
在您的问题中,您描述了这种类型的函数:
circuit :: Signal Bool -> Signal Bool -> Signal Bool
circuit switch input = ...
Run Code Online (Sandbox Code Playgroud)
你可以使用这些概念和递归来构建.祝好运!