如何编写中缀函数

时间:2013-05-14 16:48:41

标签: f#

有没有办法编写不使用符号的中缀函数?像这样:

let mod x y = x % y
x mod y

可能是“mod”之前的关键字。

2 个答案:

答案 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