Эти шаблоны:
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)