2009-11-11 3 views
4

Dans le code Haskell suivant, comment cela peut-il être écrit plus succinctement? Est-il nécessaire d'énumérer les quatre conditions, ou peut-on les résumer par un modèle plus compact? Par exemple, existe-t-il un moyen de tirer parti de Haskell sachant déjà comment ajouter un float et un int, sans avoir à spécifier manuellement fromIntegral?Types de données de correspondance de modèle dans Haskell. Des raccourcis?

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))) 

Répondre

7

Haskell ne pas savoir comment ajouter un Float et un Int; il est très spécifique et explicite sur les types:

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 

Définir une fonction toFloatSig:

toFloatSig (SignalInt a) = fromIntegral a 
toFloatSig (SignalFloat a) = a 

Ensuite, vous pouvez écrire:

sigAdd (SignalInt a) (SignalInt b) = SignalInt (a + b) 
sigAdd sa sb = SignalFloat (toFloatSig sa + toFloatSig sb) 

Il pourrait être opportun de faire Signal une instance du Num class, de sorte que vous pouvez les ajouter directement avec l'opérateur +. En outre, vous pouvez faire le type plus générique:

data (Num a) => Signal a = Signal a | Empty deriving (Show) 
+0

> sigAdd sa sb = SignalFloat (toFloatSig a + b toFloatSig) devrait-il être "... (+ toFloatSig sa toFloatSig sb)"? Merci. – Steve

+0

Vous avez raison, merci. – Thomas

+1

Je chercherais certainement à faire fonctionner le Num Num. –

Questions connexes