微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

字符串上的 Haskell 异常非穷举模式

如何解决字符串上的 Haskell 异常非穷举模式

我的功能

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)

我收到异常 Non-exhaustive patterns in the function `check`.

如何匹配字符串以完成模式,我也尝试了空字符串 "" 或者我什至无法在 Haskell 中的字符串上使用这种模式?

ps: palindrom.txt 是

a
aa
ab
aha
anna
anne
bry
bub

解决方法

让我们尝试手动评估几个步骤(没有 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.

因此,guards 中的所有测试都失败了,x | ... 的模式匹配失败了,报告为 "non-exhaustive patterns"

在 GHCi 中:

> case False of True -> 1

*** Exception: <interactive>:789:1-23: Non-exhaustive patterns in case

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。