在 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
我正在使用描述数字电路 (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