От сигнала Int до Int в Хаскеле

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

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

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

введите описание изображения здесь

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

1 ответ

Решение

Из-за того, как целочисленные литералы работают в Haskell, ваш код делает сравнения x == fromInteger 0 , x == fromInteger 1 и т.д. Так что это зависит от способа == а также fromInteger реализованы для Signal Int,

А если проверить источники, то получается 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
Другие вопросы по тегам