F#-创建代理

F#-创建代理,f#,c#-to-f#,unit-type,F#,C# To F#,Unit Type,目前正在阅读一系列关于F#的博客文章,目标是C#程序员。现在,我已经读完了第3部分()并感到困惑 两者的区别 让readLine=Console.readLine() 及 让readLine()=Console.readLine() 已经很清楚了,但是为什么需要在下一行中指定两个大括号-()-: 让打印(文本:字符串)(=Console.WriteLine文本 编译器不应该通过省略大括号来判断您正在声明一个委托打印,所以它看起来如下所示: 让打印(文本:字符串)=Console.WriteLin

目前正在阅读一系列关于F#的博客文章,目标是C#程序员。现在,我已经读完了第3部分()并感到困惑

两者的区别

让readLine=Console.readLine()

让readLine()=Console.readLine()

已经很清楚了,但是为什么需要在下一行中指定两个大括号-()-:

让打印(文本:字符串)(=Console.WriteLine文本

编译器不应该通过省略大括号来判断您正在声明一个委托打印,所以它看起来如下所示:

让打印(文本:字符串)=Console.WriteLine文本

而且,下面这句话对我来说没有什么意义

通常,当您有一个接受不同类型参数的函数时,编译器可以区分函数调用和委托引用,但对于单元,您必须强制它

这是否意味着当参数不同时,编译器可以安全地假定它是一个函数调用


谢谢大家的回答,我现在明白了。至于报价,我们就不谈了。

引言。我认为首先在简单的示例中讨论差异是很有用的,因为它有助于理解“单位”值是什么。第一个声明创建一个字符串值(并立即调用
ReadLine
,以获取用户的输入):

第二个声明创建了一个以单位值为参数的函数。该函数不需要接受任何输入,但我们希望将其定义为一个函数,以便可以重复执行(我们需要这样做,因为该函数有副作用-它读取用户的输入)

“unit”参数只是创建一个函数的一种方式,该函数将某些内容作为参数。“Unit”只有一个值写为
()
,因此它不表示任何信息-只是有一些参数:

> let readLine () = Console.ReadLine ();;
val readLine : unit -> string
您的问题。查看带有附加大括号的示例。这将创建一个函数,该函数将字符串作为第一个参数,并将附加的“单位”值作为第二个参数。您可以从类型签名中看到:

> let print (text : string) () = Console.WriteLine text 
val print : string -> unit -> unit
这是有效的F#声明,但不是很有用。这意味着,只有当您为该函数提供一些要打印的字符串以及附加的“单位”值时,才会调用该函数。你可以这样称呼它:

print "Hello" ()
即使没有附加的“unit”参数,它也将是一个函数(与值相反),因此添加附加参数也没有帮助(您总是创建一个可以被调用以打印不同字符串的函数)

在有些情况下,这个声明可能会很有趣。例如,您可以仅使用字符串作为参数来调用函数。在本例中,您将得到一个函数作为结果。返回的函数将使用单位并打印字符串:

let f = print "Hello" // doesn't print anything
f ()                  // prints "Hello"
f ()                  // prints "Hello" again!
因此,编译器允许您使用“单位”值作为语言中的任何其他值。这包括开始时看起来有点不熟悉(也不是很有用)的用法,但在某些情况下可能很有意义。

这是:

let print (text : string) = Console.WriteLine text
创建打印方法,如:

print "hi" // prints "hi" in the console
其中:

let print (text : string) () = Console.WriteLine text
生成打印特定字符串的方法,如:

let printHi = print "hi" // Does NOT print a string to the console

printHi () // But now this does print "hi" :)
printHi () // And this...
因此,本质上,它是一个“打印特定字符串X到控制台函数”工厂,其结果(ex printHi)可以多次重复使用。

使用currying

let makePrinter (text : string) () = Console.WriteLine text
例如,让我们创建一个总是打印特定字符串的函数

let helloPrinter = makePrinter "hello"
只需简单地打个电话,即可表示“你好”

helloPrinter ()
另一方面,

let print (text : string) = Console.WriteLine text
如果调用,立即输出“文本”

print "hello"

和returns(),而不是第一个咖喱格式的
unit->unit
类型的函数。

如果你是从C#来到F#,你可能会发现这些函数很有用:而博客中最令人困惑的方面是使用
print
作为函数名,而更好的名称是
makePrinter
,因为它接受一个字符串并返回一个函数来打印该字符串。关于引号,我不确定作者想说什么,所以我也无能为力(这对我来说也没有多大意义)。可能,他只是想强调一个事实,即F#中的值和函数声明之间存在差异。没有问题(抱歉,做了比我最初预期的更多的编辑)
print "hello"