gpt4 book ai didi

F# - 创建委托(delegate)

转载 作者:行者123 更新时间:2023-12-04 22:51:43 24 4
gpt4 key购买 nike

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

和...之间的不同

let readLine = Console.ReadLine ()





let readLine () = Console.ReadLine ()



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

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



编译器是否应该能够通过省略大括号来确定您正在声明一个委托(delegate)打印,所以它看起来如下:

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



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

Usually when you have a function that takes parameters of a different type the compiler can differentiate between a function call and a delegate reference, but for unit you have to force it.



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

谢谢大家的回答,我现在很清楚了。至于报价,我们就让它休息吧。

最佳答案

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

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

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

“unit”参数只是一种创建函数的方法,该函数将某些东西作为参数。 “单位”只有一个值,写为 () ,所以它不代表任何信息 - 只是有一些参数的事实:
> 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!

因此,编译器允许您将“单位”值用作语言中的任何其他值。这包括起初可能看起来有点陌生(而且不是很有用),但在某些情况下可能很有意义的用途。

关于F# - 创建委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4173799/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com