You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

F#自定义与&&、||同优先级运算符输出结果不符问题

原因解释

你对F#自定义运算符优先级的基础认知没错:普通自定义中缀运算符的优先级默认由首字符决定,但存在两个关键差异导致你遇到了输出不符的问题:

  1. 内置&&、||属于语法层面的特殊短路逻辑运算符,优先级被单独配置为&&高于||,不遵循普通自定义运算符的首字符优先级规则。
  2. 普通自定义运算符的首字符优先级规则中,|开头的运算符优先级高于&开头的运算符,刚好和内置逻辑运算符的优先级顺序相反。

因此你的测试表达式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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 02:15:03