Haskell中的运行长度编码功能?

Gov*_*mar 2 encoding haskell list-comprehension higher-order-functions

对于家庭作业的一部分,我需要编写一个函数,给出列表的行程编码,例如: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))
Run Code Online (Sandbox Code Playgroud)

这确实产生了正确的结果,但是在输出正确的结果后,会抛出以下错误: *** Exception: A1-Parmar-Govind.hs:(36,1)-(37,77): Non-exhaustive patterns in function encode

我觉得我不遗余力地试图解决这个错误.救命?!

Tik*_*vis 10

错误消息表示您的功能encode未考虑每个可能的情况.这样考虑一下:这个功能失败了什么样的列表?

作为更大的提示,请尝试在代码中启用警告.(:set -Wall在GHCi中.)如果您编写了一个函数但没有考虑所有可能的情况,这将给您一个警告,它甚至会告诉您错过了哪个案例!这非常方便.

关于:set -Wall你是否好奇的附注::set允许你设置GHCi的标志.这相当于ghc用这些标志调用,比如ghc -Wall.该-Wall标志启用所有警告 - 它与墙壁无关!

惯例是,任何控制警告的标志(与特定警告相反)都以a开头W; 它是命令行标志的一种原始命名空间.您还可以启用和禁用单个警告.阅读有关警告的GHC 手册页以获取更多信息可能会很有趣.