Haskell异常字符串上的非穷举模式
我的职能是Haskell异常字符串上的非穷举模式,haskell,non-exhaustive-patterns,Haskell,Non Exhaustive Patterns,我的职能是 import System.IO import Debug.Trace main :: IO () main = do datei <- openFile "palindrom.txt" ReadMode palin <- hGetContents datei putStrLn $ unlines [ check x | x <- lines palin] check :
import System.IO
import Debug.Trace
main :: IO ()
main = do
datei <- openFile "palindrom.txt" ReadMode
palin <- hGetContents datei
putStrLn $ unlines [ check x | x <- lines palin]
check :: String -> String
check x
| null x = ""
| trace ("call check "++ show x) False = x
| x == (reverse x) = if null x then ""
else do x ++ " Palindrom length " ++ show (length x)
让我们试着手动评估几个步骤(无
trace
调用),好吗
check "ab"
===
case null "ab" of True -> ""
; _ -> case "ab" == (reverse "ab") of True ->
"ab" ++ " Palindrom length " ++ show (length "ab")
===
case False of True -> ""
; _ -> case "ab" == "ba" of True ->
"ab Palindrom length " ++ show 2
===
case "ab" == "ba" of True ->
"ab Palindrom length " ++ "2"
===
case False of True ->
"ab Palindrom length " ++ "2"
===
ERROR: none of the cases matched.
因此,防护装置中的所有测试都失败了,x |……
的模式匹配失败了一口井,这被报告为“非穷举模式”
在GHCi中:
> case False of True -> 1
*** Exception: <interactive>:789:1-23: Non-exhaustive patterns in case
>大小写为假为真->1
***异常::789:1-23:案例中的非穷举模式
让我们试着手动评估几个步骤(无跟踪
调用),好吗
check "ab"
===
case null "ab" of True -> ""
; _ -> case "ab" == (reverse "ab") of True ->
"ab" ++ " Palindrom length " ++ show (length "ab")
===
case False of True -> ""
; _ -> case "ab" == "ba" of True ->
"ab Palindrom length " ++ show 2
===
case "ab" == "ba" of True ->
"ab Palindrom length " ++ "2"
===
case False of True ->
"ab Palindrom length " ++ "2"
===
ERROR: none of the cases matched.
因此,防护装置中的所有测试都失败了,x |……
的模式匹配失败了一口井,这被报告为“非穷举模式”
在GHCi中:
> case False of True -> 1
*** Exception: <interactive>:789:1-23: Non-exhaustive patterns in case
>大小写为假为真->1
***异常::789:1-23:案例中的非穷举模式
代码没有编译(编译错误不是所提到的错误消息)。请发一封邮件。如果你所有的警卫都是假的怎么办?如果您编写了多个保护,而最后一个保护并不等同于,否则
(即,它总是正确的),那么您的代码并不涵盖所有情况。另外,在一个保护中检查null x
,然后再写if null x
,这也很奇怪,因为后面的检查在那一点上是非常错误的。这是因为我把它改成了date,现在它应该编译,而我写if语句的原因是,我不知道空字符串的问题在哪里,我只是尝试了一下,因为我得到了palindrome.txt第一行的输出,然后它就停止了。是什么让你认为空字符串是导致问题的原因?(提示:不是。)如果输入字符串不是回文,您希望函数做什么?代码不编译(编译错误不是前面提到的错误消息)。请发一封邮件。如果你所有的警卫都是假的怎么办?如果您编写了多个保护,而最后一个保护并不等同于,否则
(即,它总是正确的),那么您的代码并不涵盖所有情况。另外,在一个保护中检查null x
,然后再写if null x
,这也很奇怪,因为后面的检查在那一点上是非常错误的。这是因为我把它改成了date,现在它应该编译,而我写if语句的原因是,我不知道空字符串的问题在哪里,我只是尝试了一下,因为我得到了palindrome.txt第一行的输出,然后它就停止了。是什么让你认为空字符串是导致问题的原因?(提示:不是。)如果输入字符串不是回文,您希望函数做什么?