Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“的目的是什么?”;做&引用;用F#表示法?_F# - Fatal编程技术网

“的目的是什么?”;做&引用;用F#表示法?

“的目的是什么?”;做&引用;用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

我是F#的初学者,所以这是一个简单的问题,可能是重复的,但我在任何地方都找不到答案

我正在阅读,我不明白,这里的“do!”符号是什么意思:

    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  
一般来说,
letus。这意味着,它用于组合计算表达式。对于
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!
,因为它在等待时不会阻塞线程)。

这个符号有名字吗?从何处了解更多信息?“计算表达式”或“工作流”;这里有一个古老(有些过时)的解释:现实世界函数编程中讨论计算表达式(以及序列表达式)的一章作为免费示例章节提供: