2010-11-04 10 views
8

In Prolog, können wir so etwas wie die folgenden tun:Mustervergleich äquivalente Variablen in Haskell, wie in Prolog

myFunction a (a:xs) = ... 

Dies ist, wenn das erste Argument von myFunction ist das gleiche wie das erste Element der Liste das ist im 2. Argument, diese Funktion wird ... auswerten.

Meine Frage ist jetzt ... wie eine ähnliche Sache in Haskell zu erreichen? Ich habe die Idee, dass Prologs Pattern Matching ausdrucksstarker ist als Haskells. Ich habe versucht, das in Haskell zu programmieren, und ich habe Probleme - entweder verwende ich ungültige Syntax oder der obige Trick wird einfach nicht tun.

Antwort

13

Haskell macht diese Art von "Variablenabgleich" nicht. Sie müssen explizit eine Wache auf:

8

In Haskell können Sie nicht implizit Vergleiche wie diese in einem Muster übereinstimmen. Stattdessen müssen Sie eine Wache hinzuzufügen, die explizit den Vergleich der Fall ist, etwa so:

myFunction a (b:xs) | a == b = ... 
12

Haskell nicht Vereinigung von Variablen macht, als Prolog tut. Wie die Haskell 98 report sagt

Der Satz von Mustern zu jedem Spiel entsprechend linear sein muß --- keine Variablen mehr als einmal in dem gesamten Satz erscheinen läßt.

Sie können natürlich die Variablen benennen und Staat müssen sie auch gleich sein:

f a (b:_) | a == b = ... 

Interessanterweise Agda sich lassen Informationen über Muster wie diese fließen, und führt eine spezielle Notation f x (.x:_) zu sagen, dass dies x muss x sein.

+1

In scala können Sie 'x' verwenden, um ein Muster zu kennzeichnen, das mit dem Wert einer Variablen wie dem agda-Fall übereinstimmt. –