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

时间:2018-11-03 11:05:50

标签: polymorphism ocaml infix-operator adhoc-polymorphism

我需要创建一个运算符-,该运算符给定两个字符串将返回第一个字符串减去第二个字符串的所有字符。 例如:"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 :(得分:2)

OCaml不支持即席多态性,因此给定名称仅具有一个定义。如果给该名称起一个新定义,它将“阴影化”前一个定义,除非您有资格限定它指定要使用的定义(只要它们在单独的模块中定义),否则它将使其无法使用。在这方面,运算符没有区别,只是另一个名称,这就是为什么您必须使用-.减去float的原因,而-仅用于int

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

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

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

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