我已经开始阅读有关计算表达式的内容,据我所知 - 它有一些默认和自定义的隐藏实现。
我会提供我理解的东西并请纠正我。
例如,在这种情况下,我们定义了一个自定义实现来使用 let!。让每一个表情都绑定到让!记录器块内部将记录到控制台。
type LoggingBuilder() =
let log p = printfn "expression is %A" p
member this.Bind(x, f) =
log x
f x
member this.Return(x) = x
let logger = new LoggingBuilder()
let loggedWorkflow =
logger {
let! x = 42
let! y = 43
let! z = x + y
return z
}
我记不清了,但我已经读过,如果我们不为其提供实现 - 它有一些内置的默认值。例如,当它收到 None 时,它会停止整个工作流并只返回 none,如果它会返回 Some - 代码将继续 -> 这是默认值吗?
由于后跟感叹号的关键字在幕后具有一些额外的功能,那么 async {} 块中的内容是什么?
举这个例子。
let printerAgent =
MailboxProcessor.Start
(fun inbox ->
// the message processing function
let rec messageLoop () =
async {
// read a message
let! msg = inbox.Receive()
// process a message
printfn "message is: %s" msg
// loop to top
return! messageLoop ()
}
// start the loop
messageLoop ())
我认为let! msg = inbox.Receive()
如果收到 None 将停止工作流。关于退货!我真的不知道。