F#函数重载参数号相同

时间:2015-09-17 16:18:48

标签: f#

我有一个简单的F#函数cost接收单个参数amount,用于某些计算。它是float所以我需要传递类似cost 33.0的内容,其中数学与cost 33相同。编译器抱怨它,我理解为什么,但我希望能够这样调用它,我试图创建另一个名为相同的函数,并为它们使用类型注释,我也得到编译器警告。有没有办法像C#那样做?

3 个答案:

答案 0 :(得分:7)

F#中有两种机制来实现这一点,并且两者都不依赖于“像C#”的隐式转换:

(A)方法重载

 type Sample =
     static member cost (amount: float) =
         amount |> calculations
     static member cost (amount: int) =
         (amount |> float) |> calculations

 Sample.cost 10   // compiles OK
 Sample.cost 10.  // compiles OK

(B)Using inlining

let inline cost amount =
    amount + amount

cost 10   // compiles OK
cost 10.  // compiles OK

答案 1 :(得分:2)

F#不允许重载let-bound函数,但你可以在C#等类上重载方法。

有时,您可以change the model to work on a Discriminated Union而不是一组重载的原语,但我认为仅仅为了能够区分浮点数和整数是不明智的。

答案 2 :(得分:0)

如果你想在调用站点使用int但在函数体内有一个浮点数;为什么不简单地施展呢?

let cost amount =
  // cast amount from to float (reusing the name amount to shadow the first one)
  let amount = float amount
  // rest of your function