gpt4 book ai didi

f# - 强制 let 绑定(bind)到函数而不是值

转载 作者:行者123 更新时间:2023-12-04 16:33:27 26 4
gpt4 key购买 nike

我有这段代码应该生成随机名称:

let generateName =
let rnd = System.Random()
let c1 = rnd.Next(65, 90) |> System.Convert.ToChar |> string
let c2 = rnd.Next(65, 90) |> System.Convert.ToChar |> string
let n = rnd.Next(0, 999) |> string
c1 + c2 + n

这计算为一个字符串,这不是我想要的。添加一个 unit-Parameter 解决了这个问题,但现在我必须像 C# 函数一样调用我的函数:
let myFunc() =
"Hello"

myFunc()

这是我必须这样做的方式,还是有更惯用的方式?

最佳答案

TL;DR: ()在这种情况下,它的含义与在 C# 中的含义完全不同,因此不要像在 C# 中那样格式化它——使用 let myFunc () =myFunc ()相反,它更好地反射(reflect)了实际语义,并反过来阐明您如何思考和理解代码。

在 C# 中,()表示一组空的参数(用于函数/构造函数定义)或参数(用于函数/构造函数调用站点);即,它定义或调用一个空函数。在 F# 中,()unit 类型的文字,类似于 42int 类型的文字;即,它本身就是一个值,就像 []是一个空列表的值。这种差异有很多小含义。

在 F# 中,当您定义 let -只有 () 的函数对于参数,如 let myFunc() = ,您实际上是在使用模式匹配语法来定义一个参数类型为 unit 的一元函数。 (不是零函数!)。这种模式匹配的特殊例子被认为是理所当然的,以至于很多人一开始就没有意识到它是模式匹配。但实际上,将函数定义为 let myFunc () =而不是 let myFunc (_:unit) =类似于拥有 let myFunc [] =而不是 let myFunc (x:'a list) = (并随后断言 x 为空)。

在 F# 中,当您调用 let -函数与 () ,如 myFunc () ,您不是在表示“没有参数”;您实际上提供了 unit 类型的参数,其奇异值经常被使用,以至于它有自己的文字语法:() .

说服自己unit与“无参数/参数”不同,实际上只是另一个参数/参数,就像其他任何参数/参数一样,考虑以下事实是完全合法的:

let myFunc() (i:int) (_:unit*unit) = i
let n = myFunc() 42((),())
printfn "%d" n

如您所见,给出 unit特殊的空白处理很愚蠢,因为它并不特殊。 ;-]

总而言之,由于通常(有必要?)用空格分隔任何命名参数/参数,因此它是 惯用语保持一致并对符号模式/值做同样的事情:
let myFunc () =
"Hello"

myFunc ()

关于f# - 强制 let 绑定(bind)到函数而不是值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38905735/

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