.net 异步let&;回来!计算表达式
我已经开始阅读有关计算表达式的内容,据我所知,它有一些默认和自定义的隐藏实现 我会提供我理解的东西,请纠正我 例如,在本例中,我们定义了一个自定义实现来使用let!。让每一个表情都束缚着让!记录器块内部将被记录到控制台.net 异步let&;回来!计算表达式,.net,asynchronous,functional-programming,f#,mailboxprocessor,.net,Asynchronous,Functional Programming,F#,Mailboxprocessor,我已经开始阅读有关计算表达式的内容,据我所知,它有一些默认和自定义的隐藏实现 我会提供我理解的东西,请纠正我 例如,在本例中,我们定义了一个自定义实现来使用let!。让每一个表情都束缚着让!记录器块内部将被记录到控制台 type LoggingBuilder() = let log p = printfn "expression is %A" p member this.Bind(x, f) = log x f x
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
}
我记不起精确的,但我已经读到,如果我们不提供它的实现-它有一些默认内置。例如,某些工作流在收到“无”时,将停止整个工作流并仅返回“无”,如果返回一些-代码将继续->是否为默认值
由于后跟感叹号的关键字在幕后有一些额外的功能,因此在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 ())
我想
让我来吧!msg=inbox.Receive()
如果收到“无”,将停止工作流。关于回归!我真的不知道。不,计算表达式方法没有默认实现。如果您想要Async的特殊行为,f:'T->Async)=
Bind(x,函数
|一些x->fx
|None->async.Return())
计算表达式可以解决多个Bind
实现之间的重载问题,不过您需要小心:如果类型不明确,F#将选择在类型本身上实现的方法(在本例中为默认绑定),而不是扩展方法
//这里'x'用作'int',因此F#知道它需要使用
//我的绑定实现。
异步的{
设!x=myAsyncIntOption
设y=x+1
返回()
}
//这里没有指定'x'的类型,因此F#选择使用
//默认绑定实现和'x'的类型为'int option'。
异步的{
设!x=myAsyncIntOption
返回()
}
现在,我已经说了可以做什么,但我不建议实际这样做。相反,我会做一些更明确的事情:
let printerAgent=
MailboxProcessor.启动
(趣味收件箱->
//消息处理功能
让rec messageLoop()=
异步的{
//读一条消息
将!inbox.Receive()与匹配
|无->返回()
|一些味精->
//处理消息
printfn“消息为:%s”消息
//循环到顶部
return!messageLoop()
}
//开始循环
messageLoop())
你说没有默认实现,那为什么要让它呢!在异步{}中工作?没有指定任何特殊行为。而且,我没有得到比赛!回来!因为它不需要任何绑定实现就可以工作,这意味着它有一个默认的绑定实现。let
在async{}
内部工作,因为F#()附带的AsyncBuilder
中有一个显式的Bind
实现。如果幕后没有绑定
,那么let就没有默认行为代码>。