Luiso
Luiso

Reputation: 4113

F# function overloading with same parameter number

I have a simple F# function cost receiving a single parameter amount which is used for some calculations. It is a float so I need to pass in something like cost 33.0 which in math is the same as cost 33. The compiler complaints about it, and I understand why, but I would like being able to call it like that, I tried to create another function named the same and used type annotation for both of them and I also get compiler warnings. Is there a way to do this like C# does?

Upvotes: 2

Views: 513

Answers (3)

Mark Seemann
Mark Seemann

Reputation: 233135

F# doesn't allow overloading of let-bound functions, but you can overload methods on classes like in C#.

Sometimes, you can change the model to work on a Discriminated Union instead of a set of overloaded primitives, but I don't think it would be particularly sensible to do just to be able to distinguish between floats and integers.

Upvotes: 2

Gene Belitski
Gene Belitski

Reputation: 10350

There are two mechanisms in F# to achieve this, and both do not rely on implicit casts "like C#":

(A) Method overloading

 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

Upvotes: 8

Sehnsucht
Sehnsucht

Reputation: 5049

if you want to use an int at call site but have a float inside the function body ; why not simply cast it ?

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

Upvotes: 0

Related Questions