有没有办法编写不使用符号的中缀函数?像这样:
let mod x y = x % y
x mod y
可能是“ mod”之前的关键字或其他内容。
最佳答案
现有答案是正确的-您无法在F#中定义中缀函数(仅是自定义中缀运算符)。除了管道运算符的技巧外,您还可以使用扩展成员:
// Define an extension member 'modulo' that
// can be called on any Int32 value
type System.Int32 with
member x.modulo n = x % n
// To use it, you can write something like this:
10 .modulo 3
请注意,
.
之前的空格是必需的,因为否则编译器会尝试将10.m
解释为数字文字(例如10.0f
)。我发现这比使用流水线技巧更优雅,因为F#同时支持功能样式和面向对象的样式,并且扩展方法在某种意义上类似于功能样式中的隐式运算符。管道技巧看起来像是对运算符的轻微滥用(并且乍一看可能令人困惑-也许比方法调用更令人困惑)。
就是说,我已经看到人们使用其他运算符而不是管道-也许最有趣的版本是这个版本(它还使用了可以省略运算符周围空格的事实):
// Define custom operators to make the syntax prettier
let (</) a b = a |> b
let (/>) a b = a <| b
let modulo a b = a % b
// Then you can turn any function into infix using:
10 </modulo/> 3
但这甚至不是F#世界中的既定习语,因此我可能仍会更喜欢扩展成员。