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