我有一個函數如何完全中止Haskell運行時?
import System.Exit
exit_and_report_type_mismatch :: String -> IO ExitCode
exit_and_report_type_mismatch error_message = do
putStrLn error_message
exitFailure
和另一個像這樣
interpret_expr :: Vars -> Expr -> Val
interpret_expr vars (Plus (ConsE _ _) (NumE _)) = exit_and_report_type_mismatch "Type Error: Can only concatenate list (not int) to list"
Haskell的一個部分向我抱怨,這是期望類型的Val(另一個數據I定義類型),但它實際上接收輸入IO退出碼。足夠公平 - exit_and_report_mismatch正在返回不是Val的IO ExitCode。
如何從「exit_and_report_type_mismatch」中完全中止Haskell程序?我已經讀了一些關於Haskell的異常,但是這些解釋要麼沒有意義,要麼提到必須從主函數調用ExitWith,這不是一個選項。
也考慮使用['undefined'](http://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#v:undefined),這有時更適合可讀性。但兩者只能用於標記程序員錯誤,而不是用戶錯誤。 – Beetle 2013-04-09 18:14:58
@Antal S-Z謝謝 - 這正是我正在尋找的,並感謝您最後的注意。我不確定你的意思是部分類型,因爲在我的函數中使用錯誤沒有導致Haskell抱怨類型錯誤? – nebffa 2013-04-11 09:02:03
@nebffa:部分函數不是局部類型 - 在某些方面幾乎相反:-)考慮'head :: [a] - > a'。當然,這是很好的類型;然而,有時候,它並不實際返回,而是崩潰。這就是'head'部分的意思,head []'不是一個值。儘管* head []是很好的類型,這就是我所說的「幾乎相反」的意思。如果一個函數f是全部的(比如'fst ::(a,b) - > a'),那麼'f x'保證爲所有'x'產生一個值。 (我忽略了無限和部分數據,比如'[1 ..]'和'undefined',但這是基本思想。) – 2013-04-11 16:19:02