对于家庭作业的一部分,我需要编写一个给出列表的行程编码的函数,例如:encode [a,a,b,c,c,c] = [(a,2),( b,1),(c,3)]
我差不多完成了。我写的函数是:
-- Question #5, part a:
-- Given a list such as [a, a, b, c, c, c] return the length encoding [(a, 2), (b, 1), (c, 3)]
encode :: (Eq a) => [a] -> [(a, Int)]
encode (x:[]) = []
encode (x:xs) = [(x, length(filter (==x) (x:xs)))]++encode(filter (/=x) (xs))
这确实产生了正确的结果,但是在输出正确的结果后,会抛出以下错误:*** Exception: A1-Parmar-Govind.hs:(36,1)-(37,77): Non-exhaustive patterns in function encode
我觉得我已经不遗余力地试图解决这个错误。帮助?!
答案 0 :(得分:10)
错误消息表示您的函数encode
未考虑每个可能的情况。想一想:这个函数失败了什么样的列表?
作为更大的提示,请尝试在代码中启用警告。 (在GHCi中做:set -Wall
。)如果你写了一个函数但没有考虑所有可能的情况,这会给你一个警告,它甚至会告诉你你错过了哪个案例!它非常方便。
关于:set -Wall
的附注,如果您感到好奇::set
允许您从GHCi设置标记。这相当于使用ghc
这些标志调用ghc -Wall
。 -Wall
标志启用所有警告 - 它与墙壁无关!
惯例是,任何控制警告的标志(与特定警告相反)都以W
开头;它是命令行标志的一种原始命名空间。您还可以启用和禁用单个警告。阅读GHC manual page about warnings以获取更多信息可能会很有趣。