-
Notifications
You must be signed in to change notification settings - Fork 833
Description
Related to #1200
What
There is a difference between int32 * int32 -> unit and (int32 * int32) -> unit. The first one generates 2 parameters and the second one generates 1 tuple parameter. One might stumble upon this error:
type IInterface =
abstract Function : (int32 * int32) -> unit
{ new IInterface with
member this.Function (i, j) = ()
}
FS0768: The member 'Function' does not accept the correct number of arguments, 1 arguments are expected
Why
The error message is confusing, because one might not expect the brackets to change the overall function signature and assume to the result as with:
type IInterface =
abstract Function : int32 * int32 -> unit
{ new IInterface with
member this.Function (i, j) = ()
}
How
Trying to address @forki proposals ( #1200 (comment) ):
- it should be singular
- it could hint the signature of Function
- it could tell something about tuples vs. "C# style parameters"
E.g.:
FS0768: The member 'Function : (int32 * int32) -> unit' does not accept the correct number of arguments. Expecting 1 argument
(int32 * int32)
but given are 2 arguments
int32 * int32
Member functions with a single tuple argument are compiled to C#-ish parameters instead of a single parameter of type tuple, unless forced otherwise.
I am unsure about the "tuples vs C# style parameters" explanation (also a native speaker should choose the exact wording :) )