Dev*_*nch 4 .net f# task-parallel-library
我正在使用Giraffe使用Async工作流创建本机.NET任务,因为我需要与Discord.NET库的互操作性.我有一个事件需要一个Task,但我写的事件处理程序返回一个Task<unit>由于某种原因,类型检查器不够聪明,不能意识到它是相同的事情.有没有办法将其转换Task<unit>为直线Task?
这是我的代码:
let messageReceived (msg : SocketMessage) =
task {
let author = msg.Author.Username
let text = msg.Content
match msg.Author.Username with
| "Monika" -> ()
| usr ->
if text.ToLower().StartsWith "<@407367655830585344> say" then
text.Substring 26 |> msg.Channel.SendMessageAsync |> ignore
else if text.ToLower().StartsWith "<@407367655830585344>" then
let response = (Lines.VoiceLines |> Extras.randomElement).Replace("[player]", author)
msg.Channel.SendMessageAsync response |> ignore
else if text.ToLower().StartsWith "delete" then
text.Substring 7 + ".chr deleted" |> msg.Channel.SendMessageAsync |> ignore
else if Extras.onein 10 then
let response = (Lines.VoiceLines |> Extras.randomElement).Replace("[player]", author)
msg.Channel.SendMessageAsync response |> ignore
}
_client.add_MessageReceived (fun m -> messageReceived m)
Run Code Online (Sandbox Code Playgroud)
最后一行生成错误,说该MessageReceived事件需要一个带签名的函数SocketMessage -> Task:
错误FS0001:此表达式的类型为"Task",但此处的类型为"Task <unit>"
Tay*_*ood 12
Task是基类的Task<T>,所以你应该能够上溯造型Task<unit>到Task与:>运营商.尝试这样的事情:
(fun m -> messageReceived m :> Task)
Run Code Online (Sandbox Code Playgroud)
我认为这个最小的例子再现了这个问题:
// int -> Task<unit>
let sleepTaskT (m : int) = Async.Sleep m |> Async.StartAsTask
// (int -> Task) -> Task
let foo (f : int -> Task) = f 1000
// "This expression was expected to have type 'Task' but here has type 'Task<unit>'"
foo (fun m -> sleepTaskT m)
// this works by explicitly upcasting sleepTaskT's Task<unit> to Task
foo (fun m -> sleepTaskT m :> Task)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
597 次 |
| 最近记录: |