Ocaml- синтаксическая ошибка при сопоставлении с образцом - PullRequest
0 голосов
/ 22 февраля 2019

Вот мой код:

type mass    = Inf | P of int


let som = fun 
|Inf _ | _ Inf -> Inf
| (P a) (P b) -> P (a+b)

Я получаю следующую ошибку:

line 5, characters 0-1:
Error: Syntax error

Я вообще не понимаю, как я могу получить здесь синтаксическую ошибку.Я попытался заменить забаву на: сопоставить ab с тем же синтаксисом.

Я тоже пытался поставить немного: ";"все же это все еще не работает.

1 Ответ

0 голосов
/ 22 февраля 2019

Эти шаблоны:

Inf _
_ Inf

не имеют смысла в OCaml.Оба они состоят из одного шаблона, сопровождаемого непосредственно другим.(Шаблон Inf соответствует конструктору Inf, а _ - это подстановочный знак, который соответствует чему-либо.) Но в OCaml нет шаблона, состоящего из одного шаблона, за которым следует другой.

То же самое относится и к этому шаблону:

(P a) (P b)

Если бы эти шаблоны имели значение, они, казалось бы, соответствовали приложениям функций.Но шаблон не может разделить приложение-функцию, он может только отделить конструкторы данных (списки, кортежи и т. Д.).

Какое значение примера OCaml может соответствовать этому шаблону?

Обновление

Похоже, вы говорите, что значение P 2, P 3 должно соответствовать этому второму шаблону.Значение P 2, P 3 в OCaml является кортежем.Это будет соответствовать этому шаблону:

(P a), (P b)

Обратите внимание, что запятая обязательна.Запятая - это конструктор, который создает кортеж.

Обновление 2

Ну, другая ошибка в том, что ключевое слово fun допускает только один шаблон.Для нескольких шаблонов вам нужно использовать ключевое слово function.Вот правильная версия вашей функции (при условии, что вы хотите, чтобы она обрабатывала пары значений типа mass).

type mass = Inf | P of int

let som = function 
|Inf, _ | _, Inf -> Inf
| (P a), (P b) -> P (a+b)

Обновление 3

Этоболее идиоматичный в OCaml, чтобы иметь функции карри.Меня поражает, что это может быть причиной, по которой вы хотели иметь соседние шаблоны.Чтобы получить карри-версию som, вам нужно использовать явный match.Ни fun, ни function не достаточно гибки.

Это будет выглядеть так:

let som x y =
    match x, y with
    | Inf, _ | _, Inf -> Inf
    | P a, P b -> P (a + b)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...