junichiro
junichiro

Reputation: 5482

anonymous functions and overloaded methods in F#

So, if you want to write out a line to the console in F#, you do the following:

System.Console.WriteLine "foo"

Originally I thought the following was pretty much identical, just more verbose, but actually it gives the error "A unique overload for method 'WriteLine' could not be determined based on type information prior to this program point":

(fun line -> System.Console.WriteLine line) "foo"

It seems the second version is confused by the presence of overloaded WriteLine methods that take a string as well as other arguments. Is my assumption along the right lines?

Upvotes: 6

Views: 453

Answers (1)

Brian
Brian

Reputation: 118865

Not exactly. In the first case, the function call knows that it's being applied to a string literal, so it can do overload resolution to find the string overload.

In the second case, line is an unsolved type variable to type inference at the point of the call to the overloaded WriteLine method, so it doesn't know which overload to pick, and it hasn't seen the string argument yet, as type inference is left-to-right.

Change it to

"foo" |> (fun line -> System.Console.WriteLine line)

and it will work, because the type inference variable for line will get unified with string from "foo" coming in, before it needs to determine the WriteLine call.

So they key is left-to-right type inference; in the absence of a solution to a type variable, it may not be possible to pick an overload yet.

Upvotes: 13

Related Questions