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

6

因此,如果您想在F#中将一行内容写入控制台,可以按照以下步骤进行:

System.Console.WriteLine "foo"

最初,我认为以下内容基本相同,只是更冗长,但实际上它会出现错误:“在此程序点之前,无法根据类型信息确定方法‘WriteLine’的唯一重载”:

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

看起来第二个版本被接受了带有字符串和其他参数的重载WriteLine方法的存在而感到困惑。我的假设是否正确?

1个回答

13

并不完全正确。在第一种情况下,函数调用知道它被应用于一个字符串字面量,因此它可以进行重载决议以找到字符串重载。

在第二种情况下,line是一个未解析的类型变量,对于调用重载的WriteLine方法来说,类型推断无法确定它应该选择哪个重载,而且由于类型推断是从左到右进行的,它还没有看到字符串参数。

将其更改为

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

它将起作用,因为类型推断变量line将与来自"foo"的string统一,它需要确定WriteLine调用之前。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接