簡體   English   中英

在Haskell中處理異常

[英]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根據自己的喜好拋出異常,或者只選擇更明智的錯誤處理,例如EitherMaybe

使用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

RightLeft是可以使用的不同類型的值構造函數,在本例中為bString

這個函數返回Either一個Stringb取決於索引是否成功。 當索引到一個空列表時,它使用模式匹配失敗,並使用遞歸最終進行仿真!! 請注意,由於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

通常,使用EitherMaybe比發信號通知錯誤是一個更好的主意,因為它允許您的代碼通過簡單的模式匹配來優雅地處理Haskell類型系統中的錯誤情況。

暫無
暫無

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

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