目前,针对C#程序员的F#上的一系列博客文章。现在我已经阅读了第3部分( http://www.jelovic.com/weblog/?p=220 )并感到困惑。

和...之间的不同

让readline = Console.Readline()

让readline()= console.readline()

已经足够清楚了,但是为什么需要在以下行中指定两个括号 - () -

令打印(text:string)()= console.writeline文本

编译器是否应该能够通过省略牙套来确定您正在宣布代表印刷品,因此看起来如下:

令打印(文本:字符串)= console.writeline文本

另外,以下行对我来说毫无意义

通常,当您具有采用不同类型的参数的函数时,编译器可以区分函数调用和委托参考,但是对于单位,您必须强制它。

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

谢谢大家的答案,现在对我来说很明显。至于报价,我们将休息。

有帮助吗?

解决方案

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

> let readLine = Console.ReadLine ();;
val readLine : string

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

“单元”参数只是创建将某些内容作为参数的函数的一种方式。 “单位”只有单个值为 (), ,因此它不代表任何信息 - 只是有一些参数的事实:

> let readLine () = Console.ReadLine ();;
val readLine : unit -> string

你的问题。 用其他牙套查看您的示例。这会创建一个将字符串作为第一个参数的函数,并将其他“单位”值作为第二个参数。您可以从类型签名中看到它:

> let print (text : string) () = Console.WriteLine text 
val print : string -> unit -> unit

这是有效的f#声明,但不是很有用。这意味着仅当您给它一些字符串以打印和其他“单位”值时才会调用该函数。您可以这样称呼它:

print "Hello" ()

即使没有其他“单位”参数,它也将是一个函数(与值相反),因此添加附加参数无济于事(您始终创建一个可以称为打印不同字符串的函数)。

在某些情况下,该声明可能会很有趣。例如,您可以将字符串作为参数调用该函数。在这种情况下,您将获得函数作为结果。返回的功能将采用单元,并将打印字符串:

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)可以多次重复使用。

使用咖喱,

let makePrinter (text : string) () = Console.WriteLine text

让我们创建一个始终打印某个字符串的函数,例如

let helloPrinter = makePrinter "hello"

简单地打电话给“你好”

helloPrinter ()

另一方面,

let print (text : string) = Console.WriteLine text

立即输出“文本”如果调用

print "hello"

和return(),不是类型的函数 unit -> unit 就像第一个咖喱案一样。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top