题
目前,针对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
就像第一个咖喱案一样。