gpt4 book ai didi

.net - 在此 bind() 参数中省略 unit 参数时,我是否应该看到不同之处?

转载 作者:行者123 更新时间:2023-12-04 14:38:44 25 4
gpt4 key购买 nike

在这个来自 computation expressions section of the F Sharp Programming Wikibook 的 F# 代码中:

let addThreeNumbers() =
let bind(input, rest) =
match System.Int32.TryParse(input()) with
| (true, n) when n >= 0 && n <= 100 -> rest(n)
| _ -> None

let createMsg msg = fun () -> printf "%s" msg; System.Console.ReadLine()

bind(createMsg "#1: ", fun x ->
bind(createMsg "#2: ", fun y ->
bind(createMsg "#3: ", fun z -> Some(x + y + z) ) ) )

当我转换时 input()inputcreate Msg msg来自 fun () -> printf "%s" msg; System.Console.ReadLine()printf "%s" msg; System.Console.ReadLine() :
let addThreeNumbers() =
let bind(input, rest) =
match System.Int32.TryParse(input) with
| (true, n) when n >= 0 && n <= 100 -> rest(n)
| _ -> None

let createMsg msg = printf "%s" msg; System.Console.ReadLine()

bind(createMsg "#1: ", fun x ->
bind(createMsg "#2: ", fun y ->
bind(createMsg "#3: ", fun z -> Some(x + y + z) ) ) )

当我在 dotnetfiddle.net 上运行该程序时,它的行为似乎完全相同。这是否只是一种边缘情况,其中实际上不需要单位参数来延迟计算,因为它们依赖于来自 Console.ReadLine() 的用户输入,或者修改后的版本不正确,或者它的行为方式是否与我不同?没注意到?

最佳答案

在实践中

你是对的。在这种情况下,事实是input计算“延迟”是完全多余的,因为它在 bind 的第一行无条件地“取消延迟” ,因此不可能出现延迟计算稍后运行或根本不运行的情况。

一个细微的区别(在实践中无关紧要)是:在原始代码中,Console.ReadLine从内部调用 bind ,但在您修改后的代码中,Console.ReadLinebind 之前被调用,然后将其结果传递给 bind .

bind不知何故更复杂(比如,如果它在 try .. with 周围有一个 input() 块或类似的东西),那么这种差异就会很重要。然而,事实上,延期没有任何好处。

但理论上

您可以看到差异的另一种方式是,如果您“提前”准备阅读 Action 而不是现场创建它们:

let msg1 = createMsg "#1: "
let msg2 = createMsg "#2: "
let msg3 = createMsg "#3: "
bind(msg1, fun x ->
bind(msg2, fun y ->
bind(msg3, fun z -> Some(x + y + z) ) ) )

有了这个代码,原来的 bind可以正常工作,但您修改后的 bind会导致所有三个输入每次都发生,而不是在第一个无效输入上停止。

虽然这表面上看起来是随机的,但它实际上说明了程序设计中的一个重要考虑因素:评估和执行之间的区别。通俗地说,“评估”可以理解为“准备工作”,而“执行”可以理解为“实际做工作”。在我上面的代码片段中,行 let msg1 =表示对输入读取操作的评估,同时调用 bind(msg1, ...)表示该 Action 的执行。

很好地理解这种差异可以导致更好的程序设计。例如,当保证评估与执行分离时,它可以被优化、缓存或检测等,而不会改变程序的含义。在像 Haskell 这样的语言中,语言的设计保证了评估和执行的分离,编译器获得了前所未有的优化自由,从而产生了更快的二进制代码。

虽然我没有读过你所指的那本书,但我猜想这个例子的目的是为了证明这种差异,所以虽然推迟计算没有实际意义,但可能有教育意义。

关于.net - 在此 bind() 参数中省略 unit 参数时,我是否应该看到不同之处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49680526/

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