Haskell中的游程编码函数?
对于家庭作业的一部分,我需要编写一个函数,给出列表的运行长度编码,例如:encode[a,a,b,c,c]=[(a,2),(b,1),(c,3)] 我快做完了。我写的函数是:Haskell中的游程编码函数?,haskell,encoding,list-comprehension,higher-order-functions,Haskell,Encoding,List Comprehension,Higher Order Functions,对于家庭作业的一部分,我需要编写一个函数,给出列表的运行长度编码,例如:encode[a,a,b,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)]
-- 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))
这确实会产生正确的结果,但是,在输出正确的结果后,抛出以下错误:***异常:A1 Parmar Govind.hs:(36,1)-(37,77):函数编码中的非穷举模式
我觉得我想尽一切办法来解决这个错误。救命啊 错误消息表示您的函数
encode
没有考虑每一种可能的情况。这样想:这个函数失败的原因是什么
作为更大的提示,请尝试在代码中启用警告。(do <代码>:在GHCI中设置Wall -/COD>)这将给你一个警告,如果你曾经写过一个函数,但是不要考虑所有可能的情况,它甚至会告诉你你错过了哪一个案例!它很方便
如果您好奇的话,还有一个关于:set-Wall
的旁注::set
允许您从GHCi设置标志。这相当于使用那些标志调用ghc
,如ghc-Wall
。-Wall
标志启用所有警告—它与墙无关
惯例是,控制一般警告(与特定警告相反)的任何标志都以
W
开头;它是命令行标志的一种基本名称空间。您还可以启用和禁用单个警告。阅读GHC了解更多信息可能会很有趣。我不知道程序为何崩溃,但您确定程序正确吗?我认为如果有两个字符序列,它会产生错误的结果,因为长度将考虑剩余字符串中的所有事件而不是当前序列。你可以使用<代码> Tuffer-和