2010-09-16 6 views
15

Idéalement je voudrais écrire quelque chose comme ceci:modèle Haskell correspondant - comment utiliser des constantes variables

 
myValue1 = 1 :: Int 
myValue2 = 2 :: Int 

myFunc :: Int -> Bool 
myFunc myValue1 = True 
myFunc myValue2 = False 

appel myFunc myValue2 retours True - pas ce que je veux. Je sais pourquoi cela se produit, mais existe-t-il un moyen d'exprimer cela dans Haskell sans recourir à des déclarations #define de style C?

+0

Merci tout le monde, pour les réponses extrêmement rapides! – Kevin

Répondre

22

Eh bien, Haskell n'unifie pas les noms comme ça. Ces nouveaux identifiants 'myValue1' et '2' sont de nouvelles variables que vous liez.

La façon la plus Haskelly est d'utiliser des types forts et correspondance de motif:

data Values 
    = D1 
    | D2 

myFunc :: Values -> Bool 
myFunc D1 = True 
myFunc D2 = False 

vous donne une garantie statique que « 1 » ou « 2 » peut être passé à myFunc, la correspondance symbolique appropriée et que vous conserviez même conversion en entiers en dérivant Enum.

+0

Merci, cela semble être le plus proche de ce que je veux faire - je n'avais pas pensé à dériver Enum, qui sera juste le ticket. – Kevin

6

Si vous ne voulez pas créer un autre type de données, la solution habituelle est d'utiliser des gardes:

myValue1 = 1 :: Int 
myValue2 = 2 :: Int 

myFunc :: Int -> Bool 
myFunc val | val == myValue1 = True 
      | val == myValue2 = False 

Ce que vous mettez après le tuyau peut être une condition booléenne; si c'est vrai, le corps de la fonction correspondante sera exécuté.

12

Vous ne pouvez pas faire correspondre les valeurs de variables comme expliqué par Don.

Mais vous pouvez utiliser des gardes dans ce cas:

myValue1 = 1 :: Int 
myValue2 = 2 :: Int 

myFunc :: Int -> Bool 
myFunc x 
    | x == myValue1 = True 
    | x == myValue2 = False 
1

Si l'idée est juste de définir des constantes à utiliser dans les modèles, vous pouvez également utiliser l'extension de la langue PatternSynonyms:

{-# LANGUAGE PatternSynonyms #-} 

pattern MyValue1 = 1 
pattern MyValue2 = 2 

myFunc :: Int -> Bool 
myFunc MyValue1 = True 
myFunc MyValue2 = False 
Questions connexes