"做什么!"的目的是什么?F#中的符号?

Max*_*kin 19 f#

我是F#的初学者,所以这是一个简单的问题,也许是重复的,但我无法在任何地方找到答案......

我正在阅读这个LOGO DSL实现,我不明白,"do!"是什么意思.这里的符号:

    this.Loaded.Add (fun _ ->
        async {
            do! Async.Sleep 200
            for cmd in theDrawing do
                do! this.Execute(cmd)
        } |> Async.StartImmediate 
    )
Run Code Online (Sandbox Code Playgroud)

你能帮我吗?

Tom*_*cek 20

我只会补充说,do!计算表达式不必显式支持表示法,因为同样的事情可以用let!这样写:

do! foo()       // Using do!
let! _ = foo()  // Equivalent using let!
Run Code Online (Sandbox Code Playgroud)

通常let!我们在使用计算表达式实现某些函数时使用,并且您希望从另一个相同类型的计算表达式中调用它.这意味着,它用于组合计算表达式.对于async组合意味着您具有非阻塞异步代码,并以某种特殊方式从另一个异步工作流调用它以使调用异步.

let!关键字允许你这样做,并得到一些价值的结果,同时do!是一个快捷方式,如果计算不返回任何东西,你可以使用.

有关计算表达式(以及序列表达式)的实际函数式编程的章节可作为免费样本提供,因此如果您想阅读有关计算表达式的更详细的教程,这可能是一个很好的信息来源:

顺便说一句:应该可以使用这样的AwaitEvent原语以更好的方式在你的问题中编写示例代码:

async { 
  let! _ = this.Loaded |> Async.AwaitEvent 
  do! Async.Sleep 200 
  for cmd in theDrawing do 
     do! this.Execute(cmd)  } |> Async.StartImmediate  
Run Code Online (Sandbox Code Playgroud)

这意味着同样的事情 - 它首先等待直到Loaded事件发生,然后它等待200ms然后它完成其余的工作.这种等待是特殊的(这就是我们使用let!/ 的原因do!,因为它不会在等待时阻塞线程).


Bri*_*ian 9

F#计算表达式(又名"工作流程")使用语法

builder { expression }
Run Code Online (Sandbox Code Playgroud)

哪里expression可以包含特殊结构,包括各种"爆炸"关键字,如let!do!.就像C#或VB中的LINQ一样,F#计算表达式只是一个语法糖(在方法调用上消失了builder).

其中最常见的类型计算表达式的是async,如所描述这里.

在这个特定的例子中,async正在使用它Async.Sleep来暂时离开UI线程,给UI一个重绘的机会,对鼠标事件作出反应等.这里更详细地描述了这种一般技术.