gpt4 book ai didi

f# - 关于成功编译的前缀运算符的错误 : Unexpected infix operator in expression,

转载 作者:行者123 更新时间:2023-12-04 08:24:51 30 4
gpt4 key购买 nike

尝试使用中缀运算符,我对以下内容感到惊讶:

let (>~~~) = function null -> String.Empty | s -> s  // compiles fine, see screenshot
match >~~~ input with .... // error: Unexpected infix operator in expression

val (>~~~) : string -> string)

和:

Unexpected infix operator

更改前缀 运算符的第一个字符(例如更改为!~~~)可以修复它。我得到一个错误,说 infix 运算符是意外的,这很奇怪。悬停显示定义为 string -> string

我对这个错误并不太惊讶,F# 要求 (iirc) 前缀运算符的第一个字符本身必须是预定义的前缀运算符之一。但为什么它编译得很好,而当我使用它时,编译器会报错?

更新:当我在运算符定义中使用无效字符时,F# 编译器似乎在其他情况下知道得很好,它说 “无效运算符定义。前缀运算符定义必须使用有效的前缀运算符名称。”

Invalid operator definition.

最佳答案

F# 中自定义运算符的规则非常严格 - 因此即使您可以定义自定义运算符,也有很多关于它们行为方式的规则,您无法更改这些规则。特别是:

  • 只有部分运算符(主要是带有!~的运算符)可以作为前缀运算符。使用 ~ 还可以重载一元运算符 +-~~~,所以如果你定义了一个名为 ~+. 的运算符,你就可以像这样使用它+。 42
  • 其他运算符(包括以>开头的运算符)只能用作中缀。您可以使用括号将任何运算符转换为普通函数,这就是为什么例如(+) 1 2 有效。
  • ? 符号比较特殊(用于动态调用),不能作为自定义运算符的第一个符号出现。

我认为最直观的思考方式是自定义运算符的行为类似于标准 F# 运算符,但您可以在标准运算符名称后添加其他符号。

关于f# - 关于成功编译的前缀运算符的错误 : Unexpected infix operator in expression,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39339322/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com