【发布时间】:2017-01-13 08:09:10
【问题描述】:
玩弄中缀运算符后,我对以下内容感到惊讶:
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# 编译器似乎知道在其他情况下就好了,它说 “无效的运算符定义。前缀运算符定义必须使用有效的前缀运算符名称。”
【问题讨论】:
-
如果你也把
>~~~放在匹配表达式的括号内呢? -
@s952163: 很简单,但是,确实有效。但是,如果您必须添加括号,它首先会破坏创建运算符的宏伟想法。
-
是的......不幸的是。我不知道为什么。这确实是一个非常有趣的案例。
-
在F#brackets are used to control precedence中,自定义运算符的优先级为controlled by a pre-defined table。所以
>的优先级不同于!。 -
@s952163 给定
let (~+.) x = -x,你实际上可以写成+. 10。~符号用于区分以+开头的二元运算符和以+开头的一元运算符。
标签: f# operator-overloading prefix-operator infix-operator