Dot-Net

F# - 將 Task<unit> 轉換為普通任務

  • February 1, 2018

我正在使用 Giraffe 創建具有非同步工作流的本機 .NET 任務,因為我需要與 Discord.NET 庫的互操作性。我有一個需要 aTask的事件,但是我正在編寫的事件處理程序返回 aTask&lt;unit&gt;並且由於某種原因,類型檢查器不夠聰明,無法意識到它是同一件事。有沒有辦法將其轉換Task&lt;unit&gt;為直線上升Task

這是我的程式碼:

let messageReceived (msg : SocketMessage) =
   task {
       let author = msg.Author.Username
       let text = msg.Content
       match msg.Author.Username with
           | "Monika" -&gt; ()
           | usr -&gt;
               if text.ToLower().StartsWith "&lt;@407367655830585344&gt; say" then
                   text.Substring 26 |&gt; msg.Channel.SendMessageAsync |&gt; ignore
               else if text.ToLower().StartsWith "&lt;@407367655830585344&gt;" then
                   let response = (Lines.VoiceLines |&gt; Extras.randomElement).Replace("[player]", author)
                   msg.Channel.SendMessageAsync response |&gt; ignore
               else if text.ToLower().StartsWith "delete" then
                   text.Substring 7 + ".chr deleted" |&gt; msg.Channel.SendMessageAsync |&gt; ignore
               else if Extras.onein 10 then
                   let response = (Lines.VoiceLines |&gt; Extras.randomElement).Replace("[player]", author)
                   msg.Channel.SendMessageAsync response |&gt; ignore
   }

_client.add_MessageReceived (fun m -&gt; messageReceived m)

最後一行生成一個錯誤,說明該MessageReceived事件需要一個帶有簽名的函式SocketMessage -&gt; Task

錯誤 FS0001:此表達式的類型應為“任務”,但此處的類型為“任務<單元>”

Task是 的基類Task&lt;T&gt;,因此您應該能夠向上Task&lt;unit&gt;轉換為Taskwith:&gt;運算符。嘗試這樣的事情:

(fun m -&gt; messageReceived m :&gt; Task)

我認為這個最小的例子重現了這個問題:

// int -&gt; Task&lt;unit&gt;
let sleepTaskT (m : int) = Async.Sleep m |&gt; Async.StartAsTask
// (int -&gt; Task) -&gt; Task
let foo (f : int -&gt; Task) = f 1000
// "This expression was expected to have type 'Task' but here has type 'Task&lt;unit&gt;'"
foo (fun m -&gt; sleepTaskT m)
// this works by explicitly upcasting sleepTaskT's Task&lt;unit&gt; to Task
foo (fun m -&gt; sleepTaskT m :&gt; Task)

引用自:https://stackoverflow.com/questions/48553068