Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 如何检查函数是否返回常规值或调用错误?_Function_Haskell_Error Handling - Fatal编程技术网

Function 如何检查函数是否返回常规值或调用错误?

Function 如何检查函数是否返回常规值或调用错误?,function,haskell,error-handling,Function,Haskell,Error Handling,我得到了一些代码,比如: setA :: Integer -> Integer setA 3 = 5 setA 5 = 6 setA 7 = error "some error one" setA _ = error "some error two" 现在我尝试编写另一个函数 checkError :: Integer -> Bool checkError x = if HERE_TO_CHECK_IF setA x RETURNS some error two

我得到了一些代码,比如:

setA :: Integer -> Integer
setA 3 = 5
setA 5 = 6
setA 7 = error "some error one"
setA _ = error "some error two"
现在我尝试编写另一个函数

checkError :: Integer -> Bool
checkError x = if HERE_TO_CHECK_IF setA x RETURNS some error two
                then False
                else True
但是我该怎么做呢

谢谢

您的setA功能不正确。如果希望函数能够返回错误值,则应使用以下任一方法:

检查错误非常简单:

checkError :: Either String Integer -> Bool
checkError = either (const True) (const False)
您的setA函数不正确。如果希望函数能够返回错误值,则应使用以下任一方法:

检查错误非常简单:

checkError :: Either String Integer -> Bool
checkError = either (const True) (const False)

据我所知,错误调用并不意味着被调用方捕获——如果您希望错误可以恢复,setA函数应该使用其他一些机制,比如。如果您坚持捕获错误,您可以在IO monad中执行此操作,请参阅。

据我所知,错误调用并不意味着被调用方捕获–如果您希望错误可以恢复,setA函数应该使用其他一些机制,例如。如果您坚持要捕获错误,您可以在IO单子内执行此操作,请参阅。

正如其他答案中所述,您应该避免使用错误,而应使用

setA :: Integer -> Either String Integer
setA 3 = Right 5
setA 5 = Right 6
setA 7 = Left "some error one"
setA _ = Left "some error two"

checkError :: Either String Integer -> Bool
checkError (Left _)  = False
checkError (Right _) = True
但如果你做不到这一点,那么看看下面的例子,看看如何按照教授的要求去做。真讨厌

那么你可以说

checkError :: Integer -> Bool
checkError x = case teaspoon x of
    Nothing -> False
    Just _  -> True

正如其他答案中已经提到的,您应该避免使用错误,而是使用

setA :: Integer -> Either String Integer
setA 3 = Right 5
setA 5 = Right 6
setA 7 = Left "some error one"
setA _ = Left "some error two"

checkError :: Either String Integer -> Bool
checkError (Left _)  = False
checkError (Right _) = True
但如果你做不到这一点,那么看看下面的例子,看看如何按照教授的要求去做。真讨厌

那么你可以说

checkError :: Integer -> Bool
checkError x = case teaspoon x of
    Nothing -> False
    Just _  -> True
虽然error应该只用于,所以不需要捕获,但这里有一个捕获错误调用的确切示例

但我认为除了编写调试器之外,这不是一种方式:

{-# LANGUAGE ScopedTypeVariables #-}
import Prelude hiding (catch)
import Control.Exception

setA :: Integer -> Integer
setA 3 = 5
setA 5 = 6
setA 7 = error "some error one"
setA _ = error "some error two"

main = do
  (print $ setA 9)
  `catch` (\(ErrorCall msg) -> putStrLn $ "I caught you, ErrorCall: " ++ msg)
  `catch` (\(exc::SomeException) -> putStrLn $ "Other exception: " ++ show exc)
对于普通编程,请将可能出现的错误结果用其中一种类型包装起来,正如其他答案所解释的。

尽管错误只应用于,因此不需要捕获,但下面是捕获错误调用的确切示例

但我认为除了编写调试器之外,这不是一种方式:

{-# LANGUAGE ScopedTypeVariables #-}
import Prelude hiding (catch)
import Control.Exception

setA :: Integer -> Integer
setA 3 = 5
setA 5 = 6
setA 7 = error "some error one"
setA _ = error "some error two"

main = do
  (print $ setA 9)
  `catch` (\(ErrorCall msg) -> putStrLn $ "I caught you, ErrorCall: " ++ msg)
  `catch` (\(exc::SomeException) -> putStrLn $ "Other exception: " ++ show exc)

对于正常编程,请按照其他答案的解释,用类型将可能的错误结果包装起来。

我无法更改setA,这是大学默认设置的。我们不允许更改setA,只有另一个:@ahmet2106您可以告诉您的教授去。。。那就检查一下他的资格。我认为这个要求可能是合理的。在学生们经历了捕捉IO单子错误的痛苦之后,你可以说这种错误处理方法显然太麻烦了,并提供了更好的界面。我无法更改setA,这是大学默认设置的我们不允许更改setA,只有另一个:@ahmet2106你可以告诉你的教授去。。。那就检查一下他的资格。我认为这个要求可能是合理的。在学生们经历了捕捉IO monad中错误的痛苦之后,你可以说这种错误处理方法显然太麻烦了,并提供了一个更好的接口。但是我们不允许更改setA,但我需要一个函数来检查,如果x是3,5,7,那么setA中只允许第二个错误,其他所有内容都应返回TRUE您是否阅读了链接问题,特别是关于Control.Exception和spoon的答案?但我们不允许更改setA,但我需要一个函数来检查,如果x为3,5,7,则仅setA中不允许第二个错误,其他所有内容都应返回TRUE您是否阅读了链接问题,特别是关于Control.Exception和spoon的答案?你想用checkError做什么?你用setA干什么?也许有一种方法可以满足您的需要,但我们不知道全局。白盒检查,checkError x=偶数x | | | x<3 | | | x>7是禁止的?不@danielfisher:我做了类似的事情,但整数不同,完整的函数也不同。我不允许发布相同的函数,如果我们使用其他代码,可能我们的prof会在任何地方搜索;我真的重写了我的版本。。现在它正在工作..您想使用checkError做什么?你用setA干什么?也许有一种方法可以满足您的需要,但我们不知道全局。白盒检查,checkError x=偶数x | | | x<3 | | | x>7是禁止的?不@danielfisher:我做了类似的事情,但整数不同,完整的函数也不同。我不允许发布相同的函数,如果我们使用其他代码,可能我们的prof会在任何地方搜索;我真的重写了我的版本。。现在它正在工作。。