在 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" 前者,使其无法使用,除非您限定它以指定您要使用的定义(只要它们在单独的模块中定义)。运算符在这方面没有什么不同,它只是另一个名字,这就是为什么你必须使用 -.
来减去 float
s,而 -
只是为了 int
s.
因为 -
是在 Pervasives
中定义的,它总是打开的,所以在一个单独的模块中定义你自己的 -
运算符,这个模块在你想使用的地方打开,它会给你关于阴影的警告,因此您通常希望避免覆盖现有运算符。
相反,我建议只定义一个不同的未使用的运算符,比如 --
:
let (--) str1 str2 = (String.length str1) - (String.length str2);;
您可以根据this table
的结合律和优先级定义任意自定义运算符
我需要创建一个运算符 -
给定两个字符串 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" 前者,使其无法使用,除非您限定它以指定您要使用的定义(只要它们在单独的模块中定义)。运算符在这方面没有什么不同,它只是另一个名字,这就是为什么你必须使用 -.
来减去 float
s,而 -
只是为了 int
s.
因为 -
是在 Pervasives
中定义的,它总是打开的,所以在一个单独的模块中定义你自己的 -
运算符,这个模块在你想使用的地方打开,它会给你关于阴影的警告,因此您通常希望避免覆盖现有运算符。
相反,我建议只定义一个不同的未使用的运算符,比如 --
:
let (--) str1 str2 = (String.length str1) - (String.length str2);;
您可以根据this table
的结合律和优先级定义任意自定义运算符