在 match 语句中使用自定义计算表达式运算符

Bar*_*ski 5 f# computation-expression

现在我正在尝试 F# 计算表达式。总体思路是返回控制机制来驱动从计算表达式构建递归函数调用的每一步之后执行的操作。整个例子可以在这里看到。

使用以下示例:

let rec loop () =
    actor {
        let! msg = m.Receive ()
        match msg with
        | "stop" -> return 0        // expected result: Return (0)
        | "unhandled" -> unhandled  // expected result: Unhandled 
        | x -> 
            mailbox.Sender() <! x
            return! loop ()         // expected result: (Become(fun m -> loop ()))
    }
loop ()
Run Code Online (Sandbox Code Playgroud)

不幸的是,这以编译时错误结束unhandled在此计算中,自定义操作可能无法与“use”、“try/with”、“try/finally”、“if/then/else”或“match”运算符结合使用表达

是否可以以任何方式在匹配语句中使用自定义运算符?

Tom*_*cek 2

我不确定actor计算的细节是什么,但如果Unhandled是底层计算类型的值,您当然可以使用return!

在不知道细节的情况下,我认为这样的事情应该有效:

match msg with
| "stop" -> return 0
| "unhandled" -> return! Unhandled
| x -> 
    mailbox.Sender() <! x
    return! loop ()   
Run Code Online (Sandbox Code Playgroud)