给定 F# 中的以下类型
type Message = string * AsyncReplyChannel<SymbolicExpression>
我该如何构建它?F# 上的好东西是为了乐趣和利润,但我找不到如何构造新的“代数数据类型” Message
。
这是我正在尝试做的事情:
member x.Evaluate(expression: string, ?timeout) : SymbolicExpression =
agent.PostAndReply(fun c -> Message (expression,c), ?timeout=timeout)
我正在尝试向MailboxProcessor
C# 公开,并尝试使尽可能多的 F# 特定类型远离 C# 代码。因此,我试图只接受一个字符串并返回一个SymbolicExpression
类型(来自RDotNet
命名空间)。
更新
好的 - 这是完整的来源。
open RDotNet
type Message = string * AsyncReplyChannel<SymbolicExpression>
type RInterfaceAgent(dllpath:string, rhome:string) =
let engine =
RDotNet.REngine.SetEnvironmentVariables(dllpath,rhome)
RDotNet.REngine.GetInstance()
let agent = MailboxProcessor<Message>.Start(fun inbox ->
let rec messageLoop n = async {
let! (msg, channel) = inbox.Receive()
engine.Evaluate(msg) |> channel.Reply
do! messageLoop (n+1)
}
messageLoop 0
)
member x.Evaluate(ex: string, ?timeout) : SymbolicExpression =
agent.PostAndReply((fun c -> Message (ex, c)), ?timeout=timeout)
这部分的错误信息:(fun c -> Message (ex, c))
是:
未定义值或构造函数 Message