Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell中的游程编码函数?_Haskell_Encoding_List Comprehension_Higher Order Functions - Fatal编程技术网

Haskell中的游程编码函数?

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)]

对于家庭作业的一部分,我需要编写一个函数,给出列表的运行长度编码,例如: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)]
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-和滴答> <代码>来修复它。@ Yogu,我确实考虑过,但是在一封电子邮件中,我的教授说他希望它考虑所有的发生而不是当前的序列。这不是一个运行长度编码的解决方案,正如其他评论提到的,但是用粗体重复它。对于输入[a,a,b,c,c,a,a],游程编码RLE应该产生[(a,2),(b,1),(c,3),(a,2)],而我认为这将产生[(a,4),(b,1),(c,3)],这使它成为一个频率计数器。谢谢!这是一个非常简单的修复之后!为了澄清,基本情况已从(x:[])更改为仅[]——现在它可以工作了!