OCaml cons (::) оператор?

В OCaml существует ли способ ссылаться на оператор cons самостоятельно?

Например, я могу использовать функции (+) и ( * ) как int -> int -> int, но я не могу использовать (::) как функцию 'a -> 'a list -> 'a list, как показано в следующем примере:

# (+) 3 5;;
- : int = 8
# ( * ) 4 6;;
- : int = 24
# (::) 1 [2;3;4];;
Error: Syntax error: operator expected.

Есть ли способ создать результат, например (::), отличный от fun x y -> x::y? И кто-нибудь знает, почему (::) не был реализован в OCaml?

Ответ 1

Нет. Минусы (::) - конструктор, конструкторы не могут быть инфиксными операторами. Разрешенные символы инфикса:

http://caml.inria.fr/pub/docs/manual-caml-light/node4.9.html

Некоторые обходные пути (как вы уже упоминаете) являются подробными

(fun x l -> x :: l)

и определение собственных нетрадиционных инфиксных минусов

let (+:) x l = x :: l

Ответ 2

Добавление к ответу @seanmcl,

Фактически OCaml поддерживает префиксную форму (::):

# (::)(1, []);;
- : int list = [1]

Это находится в неопознанной форме, что соответствует тому, что все конструкторы варианта OCaml не являются тонами и не могут быть частично применены. Это обрабатывается специальным правилом синтаксического анализа только для (::), поэтому вы получили довольно странное сообщение об ошибке Error: Syntax error: operator expected..

Update:

Предстоящий OCaml 4.02 удаляет это правило синтаксического анализа, поэтому оно больше не доступно.