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

现在我正在试验F#计算表达式.一般的想法是返回控制机制以驱动在从计算表达式的递归函数调用构建的每个步骤之后执行的动作.整个例子可以看到
here.

使用以下示例:

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 ()

不幸的是,这在未处理的情况下以编译时错误结束:自定义操作不能与’use’,’try / with’,’try / finally’,’if / then / else’或’match’运算符一起使用计算表达式.

是否有可能在match语句中使用自定义运算符?

最佳答案 我不确定actor计算的细节是什么,但如果Unhandled是底层计算类型的值,你当然可以使用return来生成它!

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

match msg with
| "stop" -> return 0
| "unhandled" -> return! Unhandled
| x -> 
    mailbox.Sender() <! x
    return! loop ()   
点赞