От сигнала 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