I've got a function in C#, and I'd like to port it (among some other stuff) over to F#, just for the sake of doing it. Unfortunately, I just hit a case for which there seems to be no way to express this in F#: Take this C# function
public static T Min<T>(params T[] p) where T : IComparable { T m1 = p[0]; foreach (T v in p) { m1 = (m1.CompareTo(v) < 0) ? m1 : v; } return m1; }
I'd thought this would be pretty easy, but I don't understand how I would specify a variable argument list in F#. I have tried this:
let rec Min l = match l with | [] -> 0 // should throw exception here | [v] -> v | (h::t) -> min h (Min t)
but calling that from C# expects a Microsoft.FSharp.Collections.List
. Is it possible to get it expect a params T[]
, and if so, how?
When you call a function in JavaScript, you can pass in any number of arguments, regardless of what the function declaration specifies. There is no function parameter limit. In the above function, if we pass any number of arguments, the result is always the same because it will take the first two parameters only.
In mathematics and in computer programming, a variadic function is a function of indefinite arity, i.e., one which accepts a variable number of arguments.
A params array is simply an array with an attribute, as Jon notes. Add the attribute before the parameter.
let test ([<ParamArray>] arr : 'a array) = if arr.Length = 0 then invalid_arg "arr" // ....
You don't need to specify the type:
let test ([<ParamArray>] arr) = ... // lets type inference do its thing
But... pattern matching doesn't work on the array type. You could write an active pattern to help. Basically, you have to decide what's more important: the F# code or the C# code. The same tradeoff will apply as you design higher order functions, use tuples, use discriminated unions, etc. C# can't express most things, and F# doesn't currently support some of the little bits of sugar C# has (Expression Tree writing in the compiler, for example).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With