1

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

4

1 回答 1

2

OCaml 不支持 ad-hoc 多态性,因此给定名称将只有一个定义。如果您给名称一个新定义,它将“遮蔽”前者,使其无法使用,除非您对其进行限定以指定要使用的定义(只要它们在单独的模块中定义)。运算符在这方面没有什么不同,它只是另一个名称,这就是为什么你必须使用-.to 减去floats,while-只是 for ints。

由于-在 中定义Pervasives,它总是打开的,-在一个单独的模块中定义你自己的操作符,该模块在你想要使用它的本地打开的地方会给你一个关于阴影的警告,所以你通常希望避免覆盖现有的操作符。

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

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

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

于 2018-11-03T12:18:50.663 回答