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 удаляет это правило синтаксического анализа, поэтому оно больше не доступно.