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?)
To było bardzo szczegółowe, dzięki! –