我需要创建一个运算符-
,给定两个字符串将返回第一个字符串减去第二个字符串的所有字符。例如:"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不支持特殊多态性,因此给定的名称只有一个定义。如果你给这个名称一个新的定义,它会"遮蔽"前者,使其不可用,除非你限定它来指定你想要使用的定义(只要它们是在单独的模块中定义的(。在这方面,运算符没有什么不同,它只是另一个名称,这就是为什么必须使用-.
减去float
s,而-
仅用于int
s。
由于-
是在始终打开的Pervasives
中定义的,因此在本地打开的单独模块中定义自己的-
运算符将向您发出阴影警告,因此您通常希望避免覆盖现有运算符。
相反,我建议定义一个不同的未使用运算符,如--
:
let (--) str1 str2 = (String.length str1) - (String.length str2);;
您可以根据此表的关联性和优先级定义任何自定义运算符