Haskell error Main.hs:(39,1)-(44,64):函数sumList中的非穷举模式

Haskell error Main.hs:(39,1)-(44,64):函数sumList中的非穷举模式,haskell,Haskell,你能帮我解决这个问题吗?编译器将生成此错误: Haskell error Main.hs:(39,1)-(44,64): Non-exhaustive patterns in function sumList 我的代码是 sumList:: [[Char]] -> [Char] -> Float sumList [] element = 0 sumList (x:xs) element |x == [] = 0 |xs == [] = 0 |

你能帮我解决这个问题吗?编译器将生成此错误:

Haskell error Main.hs:(39,1)-(44,64):
    Non-exhaustive patterns in function sumList
我的代码是

sumList:: [[Char]] -> [Char] -> Float
sumList [] element = 0
sumList (x:xs) element
     |x  == [] = 0
     |xs == [] = 0
     |x  == "" = 0
     |((splitOn "|" x)!!1) == element = 1 + (sumList xs element)
我把它修好了, 需要再添加一行以处理其他情况 那是

|otherwise = (sumList xs element)

我发现您的目标和代码非常模糊:

为什么是浮动类型?你不是在数数什么吗? x=[]=0和x===0真的都是必要的吗?它们有何不同? 我猜你想计算一些元素,有一些标签。 如果我错了,告诉我

我最终得到的代码不确定是否与您的问题对应:

hasTag :: String -> String -> Bool
hasTag tag word = case splitOn "|" word of
                    _:[] -> False -- No tag
                    _:tags -> tag `elem` tags

countHavingTag :: String -> [String] -> Int 
countHavingTag tag = length . filter (hasTag tag)
显式递归在Haskell中是非常不习惯的,您通常不需要它

您可能想了解更多关于:

类型 递归基本情况和递归规则 部分函数
为什么要检查x是否同时等于[]和?对于一个字符串,好吧,它是完全一样的。写空x | |空xs也会更干净。您可能还可以在最后一行发出括号。中缀运算符的优先级低于普通应用程序。一个浮点结果也没有多大意义,因为它的函数我真的很惊讶它被编译了。你也应该解释你想要达到的目标;你的代码中没有明显的f。您正试图解析一些文本并计算结果?同样为了清晰起见,您的类型签名可能应该为sumList::[String]->String->Int,前提是您实际上不需要浮点。如果你公布你的目标是什么,我会尝试做一个折叠查找foldr。