19

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

let mod x y = x % y
x mod y

也许“mod”之前的关键字或其他东西。

4

3 回答 3

26

现有答案是正确的 - 您不能在 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# 世界中也不是一个真正的成语,所以我可能仍然更喜欢扩展成员。

于 2013-05-14T17:12:42.537 回答
12

我不知道,但您可以使用左右管道运算符。例如

let modulo x y = x % y

let FourMod3 =  4 |> modulo <| 3 
于 2013-05-14T16:59:46.290 回答
1

要在上面的答案中添加一点,您可以创建自定义中缀运算符,但词汇表仅限于:

 !, $, %, &, *, +, -, ., /, <, =, >, ?, @, ^, |, and ~

这意味着您可以使用组合这些符号来构建中缀运算符。

请查看 MS Docs 上的完整文档。 https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/operator-overloading

于 2021-10-19T09:45:15.070 回答