Wie kann dies im folgenden Haskell-Code prägnanter formuliert werden? Ist es notwendig, alle vier Bedingungen aufzulisten, oder können diese durch ein kompakteres Muster zusammengefasst werden? Gibt es zum Beispiel eine Möglichkeit, den Vorteil zu nutzen, dass Haskell bereits weiß, wie man einen float und einen int addiert, ohne dass man manuell angeben muss fromIntegral ?
data Signal = SignalInt Int | SignalFloat Float | Empty deriving (Show)
sigAdd :: Signal -> Signal -> Signal
sigAdd (SignalInt a) (SignalInt b) = SignalInt (a + b)
sigAdd (SignalInt a) (SignalFloat b) = SignalFloat ((fromIntegral a) + b)
sigAdd (SignalFloat a) (SignalInt b) = SignalFloat (a + (fromIntegral b))
sigAdd (SignalFloat a) (SignalFloat b) = SignalFloat (a + b)
main :: IO ()
main = do
putStrLn (show (sigAdd (SignalFloat 2) (SignalInt 5)))