haskell - Haskell 中的游程编码函数?

标签 haskell encoding 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))

这确实产生了正确的结果,但是,在输出正确的结果后,抛出以下错误: *** 异常:A1-Parmar-Govind.hs:(36,1)-(37,77) :函数编码中的非详尽模式

我觉得我已经不遗余力地试图解决这个错误。帮忙?!

最佳答案

错误消息意味着您的函数encode没有考虑每一种可能的情况。这样想:这个函数对于什么样的列表会失败?

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

如果您好奇的话,关于 :set -Wall 的旁注::set 允许您从 GHCi 设置标志。这相当于使用这些标志调用 ghc,例如 ghc -Wall-Wall 标志启用所有警告 - 它与墙无关!

惯例是,任何控制一般警告(而不是特定警告)的标志都以 W 开头;它是命令行标志的一种原始命名空间。您还可以启用和禁用单独的警告。阅读 GHC manual page about warnings 可能会很有趣了解更多信息。

关于haskell - Haskell 中的游程编码函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25793571/

相关文章:

javascript - decodeURIComponent vs unescape,unescape有什么问题?

python - 如何使用 List Comprehension 将 Python 中的二维数组合并为一个字符串?

Haskell 错误接口(interface)文件

haskell - 如何重启沙盒和自定义编译的 Xmonad

algorithm - 我应该如何在 Haskell 中定义二叉树?

Haskell:为什么模式匹配中不允许使用++?

c++ - 如何比较 utf8 字符串,例如 C++ 中的波斯语单词?

python - 在数轴上设置范围的好方法是什么?

python-3.x - 如何在条件列表理解中使用函数调用结果?

python - Python中列表理解中的闭包