Почти сразу:
prop_leftInverse ((x, y):rest) = undefined
Прежде всего , вам нужны скобки вокруг всего шаблона. Во-вторых, первым элементом в списке является кортеж, но остальная часть списка - это всего лишь список кортежей, а не набор списков.
Если посмотреть на простом сопоставлении с образцом на общий список
head :: [a] -> a
head [] = error "Empty list"
head (x:xs) = x
Это работает все значения типа a
или всех типов. Если вы хотите определенного типа, такие как Int
, вы могли бы сделать
headIsOne :: [Int] -> Bool
headIsOne (1:xs) = True
headIsOne _ = False -- Here the _ matches anything
Итак, если вы хотите, чтобы соответствовать кортеж:
addTup :: (Int, Int) -> Int
addTup (x, y) = x + y
мы видим, что модель, чтобы соответствовать кортеж, как именно мы пишем один в коде, поэтому, чтобы соответствовать одному в начале списка, нам просто нужно сопоставить первый элемент с определенным шаблоном.
prop_leftInverse ((x, y):rest) = undefined
Остальная часть списка получает назначение в rest
(хотя вы можете назвать это все, что вы хотите).
Другой пример
Если вы хотите, чтобы захватить первые два кортежа:
myFunc ((x, y):(v, u):rest) = undefined
Или первые три:
myFunc ((x1, y1):(x2, y2):(x3, y3):rest) = undefined
Теперь я надеюсь, что вы можете см. рисунок (получите?)
Это было очень подробно, спасибо! –