gpt4 book ai didi

syntax - `while` 循环在 F# 计算表达式中的作用是什么?

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

如果您定义了 While builder-object 的方法,你可以使用 while -在您的 computation expressions 中循环. While的签名方法是:

member b.While (predicate:unit->bool, body:M<'a>) : M<'a>

为了比较, For 的签名方法是:
member b.For (items:seq<'a>, body:unit->M<'a>) : M<'a>

您应该注意到,在 While 中-method,body 是一个简单的类型,而不是 For 中的函数方法。

您可以嵌入一些其他语句,例如 let和计算表达式中的函数调用,但这些不可能在 while 中执行- 循环不止一次。
builder {
while foo() do
printfn "step"
yield bar()
}

为什么是 while -loop 不执行多次,而只是重复执行?为什么与 for 循环有显着差异?更好的是,是否有一些在计算表达式中使用 while 循环的预期策略?

最佳答案

如果你看 how computation expressions are evaluated ,你会看到

while foo() do
printfn "step"
yield bar()

被翻译成类似的东西
builder.While(fun () -> foo(), 
builder.Delay(fun () ->
printfn "step"
builder.Yield(bar()))))

这种转换允许多次评估 while 循环的主体。虽然您的类型签名对于某些计算表达式(例如 seqasync )是准确的,但请注意插入对 Delay 的调用可能会导致不同的签名。例如,您可以像这样定义一个列表构建器:
type ListBuilder() =
member x.Delay f = f
member x.While(f, l) = if f() then l() @ (x.While(f, l)) else []
member x.Yield(i) = [i]
member x.Combine(l1,l2) = l1 @ l2()
member x.Zero() = []
member x.Run f = f()

let list = ListBuilder()

现在您可以评估一个表达式,如:
list {
let x = ref 0
while !x < 10 do
yield !x
x := !x + 1
}

获得等效于 [0 .. 9] .

在这里,我们的 While方法具有签名 (unit -> bool) * (unit -> 'a list) -> 'a list , 而不是 (unit -> bool) * 'a list -> 'a list .一般来说,当 Delay操作类型为 (unit -> M<'a>) -> D<M<'a>> , While方法的签名将是 (unit -> bool) * D<M<'a>> -> M<'a> .

关于syntax - `while` 循环在 F# 计算表达式中的作用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4577050/

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