Error: Unexpected infix operator in expression, about a successfully compiled prefix operator
Error: Unexpected infix operator in expression, about a successfully compiled prefix operator
尝试使用中缀运算符,我对以下内容感到惊讶:
let (>~~~) = function null -> String.Empty | s -> s // compiles fine, see screenshot
match >~~~ input with .... // error: Unexpected infix operator in expression
和:
更改 prefix 运算符的第一个字符(例如 !~~~
)可以修复它。我收到 infix 运算符意外的错误,这很奇怪。悬停显示定义为 string -> string
.
我对这个错误并不感到惊讶,F# 要求 (iirc) 前缀运算符的第一个字符本身必须是预定义的前缀运算符之一。但是为什么它编译得很好,而当我使用它时,编译器会报错?
更新:当我在我的运算符定义中使用无效字符时,F# 编译器似乎在其他情况下知道得很好,它说 "Invalid operator definition. Prefix operator definitions must use a valid prefix operator name."
F# 中自定义运算符的规则非常严格 - 因此即使您可以定义自定义运算符,也有很多关于它们行为方式的规则,您无法更改这些规则。特别是:
- 只有部分运算符(主要是
!
和~
)可以作为前缀运算符。使用 ~
,您还可以重载一元运算符 +
、-
、~
和 ~~
,因此如果您定义一个名为 ~+.
的运算符,您然后可以将其用作例如+. 42
.
- 其他运算符(包括以
>
开头的运算符)只能作为中缀使用。您可以使用括号将任何运算符转换为普通函数,这就是为什么例如(+) 1 2
有效。
?
符号比较特殊(用于动态调用),不能作为自定义运算符的第一个符号出现。
我认为最直观的思考方式是自定义运算符的行为类似于标准 F# 运算符,但您可以在标准运算符名称后添加其他符号。
尝试使用中缀运算符,我对以下内容感到惊讶:
let (>~~~) = function null -> String.Empty | s -> s // compiles fine, see screenshot
match >~~~ input with .... // error: Unexpected infix operator in expression
和:
更改 prefix 运算符的第一个字符(例如 !~~~
)可以修复它。我收到 infix 运算符意外的错误,这很奇怪。悬停显示定义为 string -> string
.
我对这个错误并不感到惊讶,F# 要求 (iirc) 前缀运算符的第一个字符本身必须是预定义的前缀运算符之一。但是为什么它编译得很好,而当我使用它时,编译器会报错?
更新:当我在我的运算符定义中使用无效字符时,F# 编译器似乎在其他情况下知道得很好,它说 "Invalid operator definition. Prefix operator definitions must use a valid prefix operator name."
F# 中自定义运算符的规则非常严格 - 因此即使您可以定义自定义运算符,也有很多关于它们行为方式的规则,您无法更改这些规则。特别是:
- 只有部分运算符(主要是
!
和~
)可以作为前缀运算符。使用~
,您还可以重载一元运算符+
、-
、~
和~~
,因此如果您定义一个名为~+.
的运算符,您然后可以将其用作例如+. 42
. - 其他运算符(包括以
>
开头的运算符)只能作为中缀使用。您可以使用括号将任何运算符转换为普通函数,这就是为什么例如(+) 1 2
有效。 ?
符号比较特殊(用于动态调用),不能作为自定义运算符的第一个符号出现。
我认为最直观的思考方式是自定义运算符的行为类似于标准 F# 运算符,但您可以在标准运算符名称后添加其他符号。