F#自定义与&&、||同优先级运算符输出结果不符问题
原因解释
你对F#自定义运算符优先级的基础认知没错:普通自定义中缀运算符的优先级默认由首字符决定,但存在两个关键差异导致你遇到了输出不符的问题:
- 内置
&&、||属于语法层面的特殊短路逻辑运算符,优先级被单独配置为&&高于||,不遵循普通自定义运算符的首字符优先级规则。 - 普通自定义运算符的首字符优先级规则中,
|开头的运算符优先级高于&开头的运算符,刚好和内置逻辑运算符的优先级顺序相反。
因此你的测试表达式true ||. true &&. false会优先计算左侧的true ||. true得到true,再计算true &&. false得到false,和内置表达式true || (true && false)的计算顺序完全相反,最终输出不一致。
修复方法
方案1:显式指定运算符优先级(推荐,F# 6及以上版本支持)
你可以通过[<OperatorPrecedence>]特性直接给自定义运算符设置和内置逻辑运算符完全一致的优先级,优先级数值越大优先级越高:
[<OperatorPrecedence(12)>] // 与内置&&优先级对齐 let inline (&&.) a b = a && b [<OperatorPrecedence(11)>] // 与内置||优先级对齐,低于&&. let inline (||.) a b = a || b printf $"{true ||. true &&. false} = {true || true && false}" // 输出:True = True
方案2:旧版本F#兼容方案
如果使用F# 5及更早版本不支持优先级特性,可以选择首字符优先级符合要求的符号命名运算符,或者在使用时显式添加括号控制运算顺序:
let (&&.) = (&&) let (||.) = (||) // 显式加括号指定运算顺序 printf $"{true ||. (true &&. false)} = {true || true && false}" // 输出:True = True
内容的提问来源于stack exchange,提问作者René Ederer
相关产品推荐
相关产品推荐

