2013-11-27 13 views
5

Jak mówi tytuł postu, ja definiujących następujące funkcje w Haskell:Haskell wzorzec dopasowania listę krotek

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

które powinny brać jako wejście listę krotek. Jestem coraz parse error in pattern ale nie mogę zupełnie zrozumieć, co to jest, i też nie znalazłem żadnych informacji o tym konkretnym przypadku ...

Odpowiedz

9

Prawie rację:

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

Przede wszystkim , potrzebujesz nawiasów wokół całego wzoru. Po drugie, pierwszym elementem na liście jest krotka, ale reszta listy jest po prostu listą krotek, a nie krotką list.

Jeśli spojrzeć na prosty wzorzec dopasowania na liście rodzajowego

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

Działa to wszystkie wartości typu a lub wszystkie typy. Jeśli chcesz konkretnego typu, takie jak Int, można zrobić

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

Tak więc, jeśli chcesz dopasować krotki:

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

widzimy, że wzór dopasować krotki jest dokładnie jak piszemy jeden w kodzie, aby dopasować go do początku listy, musimy tylko dopasować pierwszy element do określonego wzorca.

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

Reszta listy zostanie przypisany do rest (chociaż można nazwać to, co chcesz).


Innym przykładem

Jeśli chciał chwycić pierwsze dwie krotki:

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

Albo pierwszych trzech:

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

Teraz mam nadzieję, że można zobacz wzór (pobierz?)

+0

To było bardzo szczegółowe, dzięki! –