“的目的是什么?”;做&引用;用F#表示法?
我是F#的初学者,所以这是一个简单的问题,可能是重复的,但我在任何地方都找不到答案 我正在阅读,我不明白,这里的“do!”符号是什么意思:“的目的是什么?”;做&引用;用F#表示法?,f#,F#,我是F#的初学者,所以这是一个简单的问题,可能是重复的,但我在任何地方都找不到答案 我正在阅读,我不明白,这里的“do!”符号是什么意思: this.Loaded.Add (fun _ -> async { do! Async.Sleep 200 for cmd in theDrawing do do! this.Execute(cmd) } |> Async.St
this.Loaded.Add (fun _ ->
async {
do! Async.Sleep 200
for cmd in theDrawing do
do! this.Execute(cmd)
} |> Async.StartImmediate
)
您能提供帮助吗?在您的情况下,它异步运行sleep表达式,因此线程可以做一些有用的事情,而不是阻塞 一般来说,
let代码>,使用代码>,屈服代码>和执行
对包含的计算表达式进行“特殊”处理(在本例中,不管是什么,async
)。例如,在一个seq{…}
中使用yield代码>允许将子序列合并到输出中,而不是作为单个对象返回。F#(又称“工作流”)使用以下语法
builder { expression }
其中expression
可以包含特殊结构,包括各种“bang”关键字,如let代码>和执行代码>。与C#或VB中的LINQ一样,F#计算表达式只是一种语法糖(在生成器上分解为方法调用)
最常见的计算表达式类型之一是async
,如前所述
在这个特定的示例中,async
与async.Sleep
一起使用,以暂时脱离UI线程,给UI一个重新绘制、对鼠标事件做出反应等的机会。下面将详细描述这种通用技术。我只想补充一点,可以计算表达式不必显式支持代码>表示法,因为可以使用let代码>如下所示:
do! foo() // Using do!
let! _ = foo() // Equivalent using let!
async {
let! _ = this.Loaded |> Async.AwaitEvent
do! Async.Sleep 200
for cmd in theDrawing do
do! this.Execute(cmd) } |> Async.StartImmediate
一般来说,let当您使用计算表达式实现某个函数,并且希望从同一类型的另一个计算表达式调用它时,使用code>us。这意味着,它用于组合计算表达式。对于async
,此组合意味着您拥有一个非阻塞异步代码,并以某种特殊方式从另一个异步工作流调用它,以使调用异步
let
keyword允许您执行此操作并获得一些值作为结果,而do
是一种快捷方式,如果计算没有返回任何内容,可以使用它
真实世界函数式编程中讨论计算表达式(以及序列表达式)的章节作为免费示例提供,因此,如果您想阅读有关计算表达式的更详细教程,这可能是一个很好的信息来源:
顺便说一句:应该可以使用AwaitEvent
原语以更好的方式编写问题中的示例代码,如下所示:
do! foo() // Using do!
let! _ = foo() // Equivalent using let!
async {
let! _ = this.Loaded |> Async.AwaitEvent
do! Async.Sleep 200
for cmd in theDrawing do
do! this.Execute(cmd) } |> Async.StartImmediate
这意味着同样的事情-它首先等待Loaded
事件发生,然后等待200ms,然后完成剩余的工作。这种等待是特殊的(这就是为什么我们使用let!
/do!
,因为它在等待时不会阻塞线程)。这个符号有名字吗?从何处了解更多信息?“计算表达式”或“工作流”;这里有一个古老(有些过时)的解释:现实世界函数编程中讨论计算表达式(以及序列表达式)的一章作为免费示例章节提供: