有没有办法编写不使用符号的中缀函数?像这样:
let mod x y = x % y
x mod y
可能是“mod”之前的关键字。
答案 0 :(得分:21)
现有答案是正确的 - 您无法在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#世界中确实不是一个惯用语,所以我可能仍然更喜欢扩展成员。
答案 1 :(得分:8)
我不知道,但你可以使用左右管道操作符。例如
let modulo x y = x % y
let FourMod3 = 4 |> modulo <| 3