Haskell не знает, как добавить Float
и Int
; это очень специфично и явно о типах:
Prelude> (5 :: Int) + 3.5
<interactive>:1:13:
No instance for (Fractional Int)
arising from the literal `3.5' at <interactive>:1:13-15
Possible fix: add an instance declaration for (Fractional Int)
In the second argument of `(+)', namely `3.5'
In the expression: (5 :: Int) + 3.5
In the definition of `it': it = (5 :: Int) + 3.5
Определить функцию toFloatSig
:
toFloatSig (SignalInt a) = fromIntegral a
toFloatSig (SignalFloat a) = a
Тогда вы можете написать:
sigAdd (SignalInt a) (SignalInt b) = SignalInt (a + b)
sigAdd sa sb = SignalFloat (toFloatSig sa + toFloatSig sb)
Также может быть целесообразно сделать Signal
экземпляром класса Num
, чтобы вы могли добавить их непосредственно с помощью оператора +
. Кроме того, вы можете сделать тип более общим:
data (Num a) => Signal a = Signal a | Empty deriving (Show)