在 Haskell 中从信号 Int 到 Int

From Signal Int to Int in Haskell

我正在使用描述数字电路 (Lava) 的 Haskell 库,它的函数输入和输出是信号类型(Signal Bool,Signal Int),据我所知没有一个将 Signal Int 转换为 Int 的函数,我知道我们可以使用 Signal Int 类型进行多种算术运算,但并非所有算术运算都是可能的。我编写了这个函数,假设将 Signal Int 转换为 Int(仅用于我需要的值)。

signalInt2int :: Signal Int -> Int
signalInt2int x = case x of 
    0 -> 0 
    1 -> 1 
    15 -> 15 
    _ -> 1000

只是为了尝试我只写了这4种可能性,问题是每当我调用这个函数无论输入是什么,输出总是1000。我确保使用Signal Int类型的输入。这是我得到的。

谁能指出问题出在哪里?我会很感激你的帮助。

由于整数文字在 Haskell 中的工作方式,您的代码 因此它取决于 ==fromInteger 为 [=15= 实现的方式].

如果您检查 sources,结果是 fromInteger 总是创建一个新的 Ref,并且不会等于任何现有的 Signal

所以问题仍然存在,如何做你想做的事。模式匹配应该可以工作,但是您需要进入 Signal 的实际结构,而不是与文字进行比较。如果我做对了(没有测试),这样的事情应该可以工作(返回 Maybe Int 因为并非所有 Signal Int 信号都是恒定的):

signalInt2int :: Signal Int -> Maybe Int
signalInt2int (Signal (Symbol ref)) = case deref ref of
    Int i -> Just i
    _ -> None