在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中可能吗?还是我必须创建一个自定义运算符?

OCaml不支持特殊多态性,因此给定的名称只有一个定义。如果你给这个名称一个新的定义,它会"遮蔽"前者,使其不可用,除非你限定它来指定你想要使用的定义(只要它们是在单独的模块中定义的(。在这方面,运算符没有什么不同,它只是另一个名称,这就是为什么必须使用-.减去floats,而-仅用于ints。

由于-是在始终打开的Pervasives中定义的,因此在本地打开的单独模块中定义自己的-运算符将向您发出阴影警告,因此您通常希望避免覆盖现有运算符。

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

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

您可以根据此表的关联性和优先级定义任何自定义运算符

最新更新