簡體   English   中英

F#try-with與reraise()結合使用返回有效類型。 為什么?

[英]F# try-with combined with reraise() returns valid type. Why?

我想弄清楚F#中的試用。 正如我所理解的那樣,try的返回類型必須與with的返回類型相同。

但是,當我做這樣的事情時,為什么呢?

 let safeIndexTry (anArray : array<'a>) (i : int) = 
  try 
    Array. item i anArray
  with
    | :? System.IndexOutOfRangeException as ex -> printfn "%s" ex.Message 
                                                  reraise()

然后我可以想到它。 然后reraise()將返回值轉換為有效類型。 在這種情況下是一個int。 但那是為什么呢? 並且對於所有類型的再加注都會這樣做嗎?

一般來說,我覺得兩個必須具有相同的返回類型有點問題。 我的意思是通常你想要計算一些值,如果它無法捕獲拋出字符串消息的異常。 有人可以給我任何指導嗎?

reraise定義的定義如下:

reraise : unit -> 'T

這意味着它的結果類型適合從中返回它的包含函數的類型。 由於拋出異常,它的返回值或多或少沒有意義。 在像Haskell這樣的語言中,它可以被認為是底層

由於函數必須具有相同的結果類型,因此要返回的更慣用的值是Option類型。 然后,如果捕獲到異常,則可以返回None如果操作成功,則返回Some goodValue 這個習慣比使用異常來處理控制流更受歡迎,因為所有調用者必須顯式地處理NoneSome情況,而不是必須用異常處理包裝器包裝所有調用代碼。

如果轉換為使用Option則以下是您的函數的外觀:

let safeIndexTry (anArray : array<'a>) (i : int) : 'a option = 
  try 
    Some <| Array. item i anArray
  with
    | :? System.IndexOutOfRangeException as ex -> None

暫無
暫無

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

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