F#中的匿名函数和重载方法

时间:2012-02-19 00:01:18

标签: f#

因此,如果您想在F#中向控制台写出一行,请执行以下操作:

System.Console.WriteLine "foo"

最初我认为以下几乎完全相同,只是更详细,但实际上它给出了错误“方法'WriteLine'的唯一重载无法根据此程序点之前的类型信息确定”:

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

似乎第二个版本因重载WriteLine方法的存在而感到困惑,这些方法接受字符串以及其他参数。我的假设是正确的吗?

1 个答案:

答案 0 :(得分:12)

不完全是。在第一种情况下,函数调用知道它正在应用于字符串文字,因此它可以执行重载解析来查找字符串重载。

在第二种情况下,line是一个未解决的类型变量,用于在调用重载的WriteLine方法时键入推断,因此它不知道要选择哪个重载,并且它还没有看到字符串参数,因为类型推断从左到右。

将其更改为

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

它会起作用,因为line的类型推断变量将与来自“foo”的string统一,之前需要确定{{ 1}}来电。

所以他们的关键是从左到右的类型推断;在没有类型变量解决方案的情况下,可能无法选择过载。