如何在F中别名.NET函数#

如何在F中别名.NET函数#,.net,f#,.net,F#,因此,在F#中,函数被认为是一等公民,因为它是一种函数编程语言,可以被引用 所以我可以做得很好 let double x = x * 2 let times2 = double 现在times2是double的别名,并且具有相同的函数签名 整数->整数 为什么我不能这样做来别名.NET函数 let write = System.IO.File.WriteAllLines 如果我尝试这样做,它会认为我丢失了一个参数,但实际上我并没有试图调用该函数,而是试图对其进行别名

因此,在F#中,函数被认为是一等公民,因为它是一种函数编程语言,可以被引用

所以我可以做得很好

    let double x = x * 2

    let times2 = double
现在times2是double的别名,并且具有相同的函数签名 整数->整数

为什么我不能这样做来别名.NET函数

   let write = System.IO.File.WriteAllLines
如果我尝试这样做,它会认为我丢失了一个参数,但实际上我并没有试图调用该函数,而是试图对其进行别名

The member or object constructor 'WriteAllLines' does not take 1 argument(s). An overload was found taking 2 arguments.

有没有一种方法可以别名预定义的.NET函数,还是不可能呢?

事实上,
System.IO.File.writeAllines
不是一个F#语法函数。它是一个静态成员,因此可以(事实上)重载它。然后编译器不知道应该选择哪个重载,他只需要您提供一个额外的提示

您可以提供以下参数之一:

let write x y = System.IO.File.WriteAllLines(x, y)
或某些类型批注:

let write  = System.IO.File.WriteAllLines : _ * _ -> _

这将解析为一个唯一的重载。

我现在明白了,这很尴尬,因为编译器本可以使用更好的错误消息。它可以说无法确定唯一的过载,这在其他情况下是可以确定的,但由于某种原因,它没有确定这个过载。