gpt4 book ai didi

haskell - 如何完全中止 Haskell 运行时?

转载 作者:行者123 更新时间:2023-12-02 14:16:07 26 4
gpt4 key购买 nike

我有一个函数

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(我定义的另一种数据类型),但它实际上接收类型为 IO Exitcode。很公平 - exit_and_report_mismatch 返回 IO ExitCode,它不是 Val。

如何从“exit_and_report_type_mismatch”中完全中止 Haskell 程序?我读过一些关于 Haskell 异常的内容,但这些解释要么没有意义,要么提到必须从主函数调用 ExitWith,这不是一个选项。

最佳答案

这就是 error 是为了.来自文档:

error :: [<a href="http://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#t:Char" rel="noreferrer noopener nofollow">Char</a>] -> a
error stops execution and displays an error message.

例如:

zsh% runhaskell <<<'main = putStrLn (error "Message") >> print "Not reached."'
runghcXXXX7729.hs: Message

putStrLn的效果被忽略,一旦 error 产生的值,程序就会终止。是必需的(惰性求值意味着仅仅将 error 放在某处不会立即导致错误;正如您可能或可能不期望的那样, let x = error "Message" in putStrLn "Printed" 不会导致错误)。使用 Control.Exception.Base 中的函数可以捕获这些异常。 ,如 catch ,但我从未这样做过,也没有见过这样做。

此外,最后一点,请考虑避免使用 error 。最好尽可能避免使用部分函数(未在整个输入域中定义的函数),因为通过总函数提供的更强保证,可以更轻松地推理代码。就总功能而言,f :: A -> B 很好。真正的意思是“函数f返回B类型的东西”;对于部分函数,​​f :: A -> B仅表示“如果函数 f 返回,那么它返回的类型为 B”。在您的情况下,这可能意味着具有类似 interpretExpr :: Vars -> Expr -> Either RuntimeError Val 的类型,或适当同构的东西(在最简单的情况下,可能是 data Result = Error String | Value ValinterpretExpr :: Vars -> Expr -> Result )。

关于haskell - 如何完全中止 Haskell 运行时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15896428/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com