От сигнала Int до Int в Хаскеле - PullRequest
0 голосов
/ 28 ноября 2018

Я работаю с библиотекой Haskell, которая описывает цифровые схемы (Lava), ее функциональные входы и выходы имеют тип сигнала (Signal Bool, Signal Int), насколько я знаю, что нет функции, которая преобразует изСигнал от Int до Int, я знаю, что есть несколько арифметических операций, которые мы можем использовать с типом Signal Int, но не все арифметические операции возможны.Я написал эту функцию, которая должна преобразовывать из Int в Signal (только для значений, которые мне нужны).

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

Просто для попытки я написал только эти 4 возможности, проблема заключается в том, что всякий раз, когда я вызываю эту функцию, независимо от того, какой ввод, вывод всегда 1000. Я обязательно использую ввод типаСигнал Инт.Вот что я получаю.

enter image description here

Кто-нибудь может указать, где проблема?Буду благодарен за вашу помощь.

1 Ответ

0 голосов
/ 28 ноября 2018

Из-за того, как целочисленные литералы работают в Haskell, ваш код выполняет сравнения x == fromInteger 0, x == fromInteger 1 и т. Д. Так что это зависит от того, как == и fromInteger реализованы для Signal 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...