Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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
.net 异步let&;回来!计算表达式_.net_Asynchronous_Functional Programming_F#_Mailboxprocessor - Fatal编程技术网

.net 异步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

我已经开始阅读有关计算表达式的内容,据我所知,它有一些默认和自定义的隐藏实现

我会提供我理解的东西,请纠正我

例如,在本例中,我们定义了一个自定义实现来使用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
    }


我记不起精确的,但我已经读到,如果我们不提供它的实现-它有一些默认内置。例如,某些工作流在收到“无”时,将停止整个工作流并仅返回“无”,如果返回一些-代码将继续->是否为默认值

由于后跟感叹号的关键字在幕后有一些额外的功能,因此在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就没有默认行为