2013-11-27 3 views
5

Как говорит название пост, я определяю следующие функции в Haskell:Haskell шаблону список кортежей

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

, которые должны принимать в качестве входных данных список кортежей. Я получаю parse error in pattern, но я не могу вполне понять, что это такое, а также не нашли никакой информации об этом конкретном случае ...

ответ

9

Почти сразу:

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 

Теперь я надеюсь, что вы можете см. рисунок (получите?)

+0

Это было очень подробно, спасибо! –

Смежные вопросы