现在我正在试验 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 ()
不幸的是,这以unhandled
上的编译时错误结束:自定义操作不能与此计算表达式中的"use","try/with","try/final","if/then/else"或"match"运算符一起使用。
是否可以以任何方式在匹配语句中使用自定义运算符?
我不确定actor
计算的细节是什么,但如果Unhandled
是底层计算类型的值,你当然可以使用return!
生成它
在不知道细节的情况下,我认为这样的事情应该有效:
match msg with
| "stop" -> return 0
| "unhandled" -> return! Unhandled
| x ->
mailbox.Sender() <! x
return! loop ()