2013-11-27 22 views
5

passend Wie der Post-Titel sagt, ich bin die folgende Funktion in Haskell definieren:Haskell Muster, das eine Liste von Tupeln

prop_LeftInverse :: (Eq a, Eq b) => [(a,b)] -> Bool 
prop_LeftInverse (x,y):(xs,ys) = undefined 

, die als Eingabe eine Liste von Tupeln zu nehmen. Ich erhalte eine parse error in pattern aber ich kann nicht ganz herausfinden, was es ist, und auch keine Informationen zu diesem speziellen Fall gefunden haben ...

Antwort

9

Fast rechts:

prop_leftInverse ((x, y):rest) = undefined 

Zu allererst , benötigen Sie Klammern um das gesamte Muster. Zweitens ist das erste Element in der Liste ein Tupel, aber der Rest der Liste ist nur eine Liste von Tupeln, kein Tupel von Listen.

Wenn Sie einfaches Muster sehen Matching auf eine generische Liste

head :: [a] -> a 
head [] = error "Empty list" 
head (x:xs) = x 

Dies funktioniert alle Werte vom Typ a, oder alle Arten. Wenn Sie einen bestimmten Typ, wie Int wollen, könnten Sie tun

headIsOne :: [Int] -> Bool 
headIsOne (1:xs) = True 
headIsOne _ = False -- Here the _ matches anything 

Also, wenn Sie ein Tupel passen wollen:

addTup :: (Int, Int) -> Int 
addTup (x, y) = x + y 

wir sehen, dass das Muster ein Tupel passen genau wie wir schreiben eins in Code, um eins am Anfang der Liste zu finden, müssen wir nur das erste Element mit einem bestimmten Muster abgleichen.

prop_leftInverse ((x, y):rest) = undefined 

Der Rest der Liste zu rest zugewiesen wird (obwohl man es so nennen kann, was Sie wollen).


Ein weiteres Beispiel

Wenn Sie die ersten beiden Tupeln greifen wollte:

myFunc ((x, y):(v, u):rest) = undefined 

Oder die ersten drei:

myFunc ((x1, y1):(x2, y2):(x3, y3):rest) = undefined 

Inzwischen hoffe ich, Sie können Sehen Sie das Muster (bekommen Sie es?)

+0

Das war sehr detailliert, danke! –