0

我正在使用描述数字电路(Lava)的Haskell libraby,它的功能输入和输出属于信号类型(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 类型的输入。这是我得到的。

在此处输入图像描述

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

4

1 回答 1

1

由于整数文字在 Haskell 中的工作方式,您的代码正在进行比较x == fromInteger 0x == fromInteger 1所以它取决于方式==fromIntegerSignal Int.

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

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

signalInt2int :: Signal Int -> Maybe Int
signalInt2int (Signal (Symbol ref)) = case deref ref of
    Int i -> Just i
    _ -> None
于 2018-11-28T10:41:37.587 回答