我想定义一些运算符,例如+
但让调用-|-
例如
let a = -|- 1
let b = 1 -|- 1
let c = 1 -|- 1 1 1 1
至少有 2 行可以使用,+
但我怎样才能像这样声明自己的运营商?
我想定义一些运算符,例如+
但让调用-|-
例如
let a = -|- 1
let b = 1 -|- 1
let c = 1 -|- 1 1 1 1
至少有 2 行可以使用,+
但我怎样才能像这样声明自己的运营商?
我认为一般来说没有一种简单的方法可以做到这一点。您可能可以使用inline
混合了静态成员约束的运算符来涵盖您想要的一些情况,但我认为它不会很优雅。
但是,对于某些运算符名称,您可以定义单独的前缀和 中缀版本,涵盖前两种情况:
// Prefix version of the operator (when you write e.g. '+. 10')
let (~+.) a = a * 10
// Infix version of the operator (when you write e.g. '1 +. 10')
let (+.) a b = a + b
// Sample use
+. 10
10 +. 20
你仍然不能写10 +. 20 30 40
,因为那样你就需要一个重载的中缀运算符。
值得注意的是,您不能对所有运算符名称执行此操作。以下是中缀运算符允许的运算符名称的F# 规范中的语法定义:
中缀或前缀操作 :=
+, -, +., -., %, &, &&prefix-op :=
infix-or-prefix-op
~ ~~ ~~~ (和任何重复的 ~)
!OP (除了 !=)
PS:我通常不是自定义运算符的忠实拥护者-在某些情况下,它们很好,但是很难发现(您在 IntelliSense 中看不到它们),除非您使用标准运算符进行数值计算,通常很难理解它们的含义。所以我可能会考虑其他方法......
So what about a Discriminated Union:
type RHS =
|One of int
|Two of int * int
...
then
let (-|-) a b =
match b with
|One(a) -> ...
|Two(a,b) -> ...
...
Call it with:
1 -|- One(1)
1 -|- Two(1,1)
....