Определить полиморфный инфиксный оператор в ocaml - PullRequest
0 голосов
/ 03 ноября 2018

Мне нужно создать оператор -, который с учетом двух строк возвращает первую строку минус все символы второй строки. Например: "abcd"-"ad"="bc".

При написании случайного кода я заметил, что если я назначу новую функцию оператору -, я не смогу снова использовать ее с целыми числами. Например:

# let (-) str1 str2 = (String.length str1) - (String.length str2);;
val ( - ) : string -> string -> int = <fun> 
# 1-2;;
Error: This expression has type int but an expression was expected of type
     string

Я хотел бы сделать так, чтобы я мог использовать оператор - между целыми числами и строками, это возможно в ocaml или я должен создать пользовательский оператор?

1 Ответ

0 голосов
/ 03 ноября 2018

OCaml не поддерживает специальный полиморфизм, поэтому у данного имени будет только одно определение. Если вы дадите имени новое определение, оно будет «затенять» первое, делая его непригодным для использования, если только вы не укажете, какое определение вы хотите использовать (если оно определено в отдельных модулях). В этом отношении оператор ничем не отличается, это просто другое имя, поэтому вы должны использовать -. для вычитания float с, а - только для int с.

Поскольку - определено в Pervasives, который всегда открыт, определение вашего собственного оператора - в отдельном модуле, который открывается локально, где вы хотите его использовать, даст вам предупреждение о теневом копировании, поэтому вы ' Обычно вы хотите избежать переопределения существующих операторов.

Вместо этого я бы рекомендовал просто определить другой неиспользуемый оператор, например --:

let (--) str1 str2 = (String.length str1) - (String.length str2);;

Вы можете определить любой пользовательский оператор в соответствии с ассоциативностью и приоритетом этой таблицы

...