Шаблон соответствия функции в Ocaml - PullRequest
0 голосов
/ 09 февраля 2020

Я новичок в Ocaml, и у меня есть вопрос о сопоставлении с образцом в Ocaml. Если у меня есть следующее определение типа:

type t = False | True | Function (t -> t)

Как я могу сопоставить термин, который Function (t -> t)? Пока единственное, что я могу сделать, это сопоставить Function f. Но есть ли способ сопоставить аргумент с функцией? В идеале было бы неплохо иметь что-то вроде

match t with
| Function (t1 -> t2) -> ...
| ...

Но, очевидно, это неправильный синтаксис. Это вообще возможно?

Ответы [ 2 ]

1 голос
/ 09 февраля 2020

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

Возможно, вы захотите представить пары значений каждый из которых имеет тип т. Это будет выглядеть примерно так:

type t = False | True | Pair of t * t

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

0 голосов
/ 13 февраля 2020

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

type t = False | True | Function (t -> t)

функция всегда имеет тип t -> t. Если вы уже поняли, что это функция, то вы уже знаете, что это t -> t. Больше нет выбора, с которым вы могли бы сравниться.

Вы также не можете сделать

match t with Function my_function -> ...

, но вы можете сделать

match t with Function f when f == my_function -> ...

Я думаю.

...