Определить полиморфный инфиксный оператор в ocaml

Мне нужно создать оператора - при наличии двух строк возвращается первая строка минус все символы второй строки. Например: "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 ответ

Решение

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

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

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

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

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

Другие вопросы по тегам