次の Haskell コードで、これをより簡潔に記述するにはどうすればよいでしょうか? 4 つの条件すべてをリストする必要がありますか、それともよりコンパクトなパターンで要約できますか? たとえば、手動でfromIntegralを指定することなく、float と int を追加する方法を既に知っている Haskell を利用する方法はありますか?
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)))