[英]Handle exception in haskell
我編寫以下代碼:
give :: [b] -> Int -> b
give list index = list !! index
現在我要添加,如果在點索引處沒有項目,則應該顯示:“該位置沒有項目!”
[1..10] `give` 10
No item at that position!
如何在Haskell中添加此內容
你真的不能。 您可以從純代碼中引發異常,但只能在IO
捕獲異常。
您可以重新實現!!
give
根據自己的喜好拋出異常,或者只選擇更明智的錯誤處理,例如Either
或Maybe
。
使用Either
處理錯誤的示例可能是
data OutOfRange = OutOfRange Int
give :: [a] -> Int -> Either OutOfRange a
give xs i | length xs > i = Right $ xs !! i
| otherwise = Left (OutOfRange i)
我將返回類型包裝在Either
monad中,如下所示:
give :: [b] -> Int -> Either String b
give [] _ = Left "No item at that position!"
give (x:xs) index | index == 0 = Right x
| otherwise = give xs $ index - 1
Either
是數據構造函數,其聲明理論上可能看起來像這樣:
data Either a b = Left a | Right b
Right
和Left
是可以使用的不同類型的值構造函數,在本例中為b
和String
。
這個函數返回Either
一個String
或b
取決於索引是否成功。 當索引到一個空列表時,它使用模式匹配失敗,並使用遞歸最終進行仿真!!
。 請注意,由於Haskell類型系統的嚴格性,您不能使用此結果,因為它只是類型b
:您必須顯式處理將其作為String的可能性。 這是一個例子:
case (give [1..10] 10) of
(Left s) -> putStrLn $ "Error" ++ s --String case
(Right i) -> putStrLn $ "The value you requested is " ++ show $ i --Int case
通常,使用Either
和Maybe
比發信號通知錯誤是一個更好的主意,因為它允許您的代碼通過簡單的模式匹配來優雅地處理Haskell類型系統中的錯誤情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.