簡體   English   中英

為什么F#failwith返回泛型類型而不是Exception類型

[英]why does F# failwith return a generic type rather than Exception type

根據文檔 ,failwith函數返回一個Exception但函數簽名是string -> 'a

為什么簽名不是string -> Exception

文檔並沒有說failwith返回Exception 它說它會產生一個F#異常。 異常系統與返回值的正常控制流分開。 因此這個名字,它是特殊的

例外情況,當“拋出”(這是一個比文檔中使用的“生成”更不模糊的術語,我認為),將在堆棧中向上移動,直到遇到try ... with處理此特定類型的異常的構造,或者如果沒有將終止該程序。 有關詳細信息,請參閱有關異常處理的F#文檔

failwith返回'a以便它可以在任何地方使用,因為'a可以被推斷為任何東西。 它可以假裝返回任何內容,因為它根本不會實際返回,與大多數函數不同,它總是拋出異常。 如果它已經返回Exception那么它只能用於期望評估為Exception表達式中,這種情況異常罕見,因為通常會拋出異常,而不會返回異常。 例如,給定:

if i > 0 then
  i
else
  failwith "i is negative"

如果failwith返回了Exception ,那么編譯器會在這里抱怨一個int被期望而不是Exception因為第一個分支的計算結果為int 但是因為failwith返回一個'a而不是,它被推斷為一個int本身,一切都很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM