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第一行的输出,然后它就停止了。是什么让你认为空字符串是导致问题的原因?(提示:不是。)如果输入字符串不是回文,您希望函数做什么?