2015-03-20 3 views
1

Мне нужно пройти список пар и проверить одно из значений в паре. Скажем, я получил этот список:f # - простая итерация по списку пар

let listOfPairs = [("Joe",100);("Bo",5);("Morten",60)] 

И я должен проверить, равна ли значение int этой пары 100 или нет. Я не ищу метод List.exist, а скорее способ проверить это с помощью сопоставления с образцом, проходя через каждую пару в списке и проверить, равно ли значение 100 или нет.

Я, очевидно, пробовал многое сам, но это слишком плохо, чтобы иметь какое-либо хорошее влияние в этом посте. Любые идеи или предложения очень ценятся, спасибо заранее.

ответ

3

Если вы не хотите использовать List.exist, то вы могли бы написать рекурсивную функцию, которая соответствует шаблон для извлечения значения:

let rec listContainsHundred = function 
    | (_, 100)::_ -> true 
    | _::tail -> listContainsHundred tail 
    | [] -> false 

В противном случае простое решение с List.exists будет:

List.exists (snd >> ((=) 100)) listOfPairs 
+0

Это сопоставление с образцом было именно тем, что я искал, спасибо огромное! Однако не могли бы вы вкратце объяснить, что такое «хвост» в этом примере? Спасибо! – Peterrr

+1

Нет проблем, оператор 'cons' (' :: ') в шаблоне соответствует первому элементу в списке и остальной части списка. Здесь 'tail' - это остальная часть списка, это передается функции, так что мы рекурсивно перебираем список –

+0

Хм .. Я просто не уверен, как он знает, когда нужно совместить первый элемент списка, и когда чтобы соответствовать остальной части списка? Сложно обернуть голову, как «хвост» не только первый элемент списка? Знает ли это, что из того, что функция принимает в качестве аргументов? – Peterrr

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