Как частично сопоставить шаблон в OCaml - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть список lst объектов типа value, где

type value = A of int | B of bool | C of string

При выполнении некоторых совпадений в списке я попытался написать

match lst with 
| A x :: val :: tl -> ...

иполучил исключение, сказав, что в переменной val ожидался паттерн. Я предполагаю, что это потому, что в начале списка я соответствовал варианту value, но для val я хотел захватить все возможные следующие записи в списке. Я могу придумать, как их обойти, например, написать несколько случаев для нескольких вариантов val. Но так как я хочу сделать одно и то же, независимо от того, что такое val, это выглядит как очень не элегантное решение. Есть ли лучшее решение?

1 Ответ

3 голосов
/ 01 ноября 2019

Составляя ответ на основе комментария glennsl, я предполагаю, что этот фрагмент, введенный на верхний уровень, воспроизводит синтаксическую ошибку, которую вы нажимаете:

image of the error at the top level

поскольку val является зарезервированным ключевым словом, его использование в сопоставлении с образцом недопустимо. Ошибка говорит о том, что подчеркнутый токен val вызывает синтаксическую ошибку, поскольку он ожидает что-то, что может быть частью шаблона .

Следующее должно без проблем скомпилироваться (например, с использованием некоторых случайных значений):

type value = A of int | B of bool | C of string

match [A 1; B true; C "foo"] with
| A x :: v :: tl -> Some (x, v)
| _ -> None

И это просто из-за замены ключевого слова val на переменную v в шаблоне.

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