【问题标题】:Custom prefix operators in F# once againF# 中的自定义前缀运算符再次
【发布时间】:2015-11-25 19:27:09
【问题描述】:

不管我看了多少遍这篇文章:F#: What are the valid prefix operators?

我和 F# 编译器从不会就自定义前缀(或中缀)运算符名称达成一致。

在上面的帖子中它说“+”可以是中缀和前缀运算符,但是:

let (+@) a = a + 20
+@ 30 |> printfn "%d"

给出错误“无效的前缀运算符”。

为什么?

【问题讨论】:

  • 有左和右关联运算符。和 in-,pre-,post-fix 运算符。规则很简单。如果您在午夜之前创建一个运算符,它是左关联的,午夜之后它是右关联的。如果你是人类它是中缀,对于狼人它是前缀,而吸血鬼只创建后缀。但是AB+血型的吸血鬼也和人类一样是中缀。在满月时创建运算符的狼人也是中缀,但满月时的人类是前缀。在一个月的第 13 个星期五,所有运算符都是 postfix。吸血鬼不能使用“~”。这就是我理解 F# 中的运算符定义的方式。

标签: f# operator-overloading


【解决方案1】:

如果您在提供的链接中查看 Brian 的答案,您会发现运营商 +@ 未在 prefix-op 中列出。并且要用作 prefix 运算符,运算符 + 应该在前面加上 ~

let (~+) a = a + 20
+ 30 |> printfn "%d"

结果:

50

【讨论】:

  • 我真的迷路了。我知道我需要在 '+' 之前添加 '~' 以使其成为前缀,但是为什么 '~+@' 不起作用? '!@' 工作正常。 OP 后缀似乎有不同的约束,具体取决于它们之前的内容?这是在哪里记录的?
  • 我认为它记录在规范中:fsharp.org/specs/language-spec Section 4.4 Operators and Precedence
猜你喜欢
  • 1970-01-01
  • 2015-09-22
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 2014-05-21
  • 1970-01-01
  • 2013-03-15
相关资源
最近更新 更多