2010-09-16 8 views
15

Ich würde im Idealfall so etwas wie dies gerne schreiben:Haskell Pattern-Matching - wie Konstanten verwenden variable

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

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

Aufruf myFunc myValue2 kehrt True - nicht das, was ich beabsichtige. Ich weiß, warum das passiert, aber gibt es eine Möglichkeit, dies in Haskell auszudrücken, ohne C-style #define Aussagen zu verwenden?

+0

Dank jeder für die extrem schnellen Antworten! – Kevin

Antwort

22

Nun, Haskell vereinheitlicht solche Namen nicht. Diese neuen Kennungen "myValue1" und "2" sind neue Variablen, die Sie binden.

Der Haskelly Weg ist stark Typen und Mustererkennung zu verwenden:

data Values 
    = D1 
    | D2 

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

Ihr eine statische Garantie gibt nur „1“ oder „2“ kann myFunc, richtiges symbolisches Matching weitergegeben werden und Sie selbst behalten Umwandlung in Ganzzahlen durch Ableitung von Enum.

+0

Danke, das scheint am nächsten zu sein, was ich machen möchte - ich hatte nicht gedacht, Enum abzuleiten, was genau das Ticket sein wird. – Kevin

6

Wenn Sie nicht wollen, einen anderen Datentyp, ist die übliche Lösung zu schaffen, ist Wächter zu verwenden:

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

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

Was Sie nach dem Rohr setzen kann jeder boolean Zustand sein; Wenn es wahr ist, wird der entsprechende Funktionskörper ausgeführt.

12

Sie können nicht mit Variablenwerten übereinstimmen, wie Don erklärt hat.

Aber Sie können in diesem Fall Wachen verwenden:

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

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

Wenn die Idee einfach ist, einige Konstanten zu definieren, in Muster zu verwenden, können Sie auch die Sprache verwenden Erweiterung PatternSynonyms:

{-# LANGUAGE PatternSynonyms #-} 

pattern MyValue1 = 1 
pattern MyValue2 = 2 

myFunc :: Int -> Bool 
myFunc MyValue1 = True 
myFunc MyValue2 = False 
Verwandte Themen