在 ocaml 中定义多态中缀运算符

Define polymorphic infix operator in ocaml

我需要创建一个运算符 - 给定两个字符串 returns 第一个字符串减去第二个字符串的所有字符。 例如:"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 中是否可行,或者我是否必须创建自定义运算符?

OCaml 不支持临时多态性,因此给定的名称将只有一个定义。如果您给名称一个新的定义,它将 "shadow" 前者,使其无法使用,除非您限定它以指定您要使用的定义(只要它们在单独的模块中定义)。运算符在这方面没有什么不同,它只是另一个名字,这就是为什么你必须使用 -. 来减去 floats,而 - 只是为了 int s.

因为 - 是在 Pervasives 中定义的,它总是打开的,所以在一个单独的模块中定义你自己的 - 运算符,这个模块在你想使用的地方打开,它会给你关于阴影的警告,因此您通常希望避免覆盖现有运算符。

相反,我建议只定义一个不同的未使用的运算符,比如 --:

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

您可以根据this table

的结合律和优先级定义任意自定义运算符