[英]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
。 這個習慣比使用異常來處理控制流更受歡迎,因為所有調用者必須顯式地處理None
和Some
情況,而不是必須用異常處理包裝器包裝所有調用代碼。
如果轉換為使用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.