Ocaml Pattern Matching - PullRequest
       10

Ocaml Pattern Matching

4 голосов
/ 14 января 2011

Эй, ребята, я довольно новичок в OCaml и сопоставлении с образцом, так что мне было трудно понять это.

Скажите, что у меня есть список кортежей.Я хочу сопоставить параметр с одним из кортежей на основе первого элемента в кортеже, и после этого я хочу вернуть второй элемент кортежа.Например, я хочу сделать что-то вроде этого:

let list = [ "a", 1; "b", 2; "c", 3; "d", 4 ] ;;
let map_left_to_right e rules = match e with 
    | first -> second 
    | first -> second 
    | first -> second

Если я использую список map_left_to_right "b", я хочу получить 2 взамен.Поэтому я хочу перечислить все первые элементы в списке правил и сопоставить параметр с одним из этих элементов, но я не уверен, как это сделать.Я думал, что мне нужно использовать List.iter или List.for_all, чтобы сделать что-то вроде этого.Любая помощь будет оценена.Спасибо!

Ответы [ 2 ]

6 голосов
/ 14 января 2011

Сопоставление шаблонов предназначено для случаев, когда вы хотите сопоставить фиксированный список шаблонов.В текущей ситуации идиоматическая вещь, которую нужно использовать: List.assoc:

let map_left_to_right e rules default = 
  try List.assoc e rules with Not_found -> default

Необходимо указать значение по умолчанию, когда элемент не найден.Здесь map_left_to_right "b" list 0 вернет 2, как ожидалось, а map_left_to_right "z" list 0 вернет 0.

1 голос
/ 29 января 2011

Совпадение сопоставляется только с фиксированными образцами, а не с переменными. Соответствующее использование сопоставления в этом случае будет выглядеть так: (обратите внимание на включение «по умолчанию», как и в другом ответе)

let list = [ "a", 1; "b", 2; "c", 3; "d", 4 ]
let rec map_left_to_right e rules default = match rules with 
    [] -> default (* No rules left to match *)
  | (first,second)::rest -> (* At least one rule remaining, which we'll put into first,second *)
      if first = e
      then second
      else map_left_to_right e rest default

Если мы хотим вернуть 0, если ничего не найдено, то это будет выглядеть так:

map_left_to_right "b" list 0

Все это функционально эквивалентно коду в другом ответе, и на практике я бы рекомендовал использовать этот код, поскольку он меньше и лучше использует существующие библиотеки, но я подумал, что я дам этот код, потому что он лучше иллюстрирует как на самом деле будет применяться сопоставление с образцом в этом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...