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会在任何地方搜索;我真的重写了我的版本。。现在它正在工作。。