Haskell学习者关于过滤和折叠的小问题

Yun*_*hen 2 haskell

这是我学习Haskell的第二天,我被一个问题严重困扰.我试图解决99个Haskell问题中的第八个问题 问题是编写一个名为"compress"的函数,其工作原理如下:

>compress "aaaabbbbccccddddd"
"abcd"
>compress [1,1,1,1,2,3,4,4,4,4]
[1,2,3,4]
Run Code Online (Sandbox Code Playgroud)

这就是我写的:

compress :: (Eq a) => [a] -> [a]
compress [] = []
compress x = filter ( (head x) `notElem` ( compress $ tail x ) ) x
Run Code Online (Sandbox Code Playgroud)

编译说:

无法匹配预期类型a -> Bool' with actual typeBool'

compress,我试图以递归方式从头到尾拾取新元素.(比如回溯也许?)

我的算法错了吗?有没有其他方式以更易读的方式实现算法?(比如:在哪里放括号?或$)

有人可以帮助我吗?非常感谢.


感谢Lubomir的帮助,我通过以下方式纠正了我的代码:

compress'(x:xs)= x:compress'(dropWhile(== x)xs)

它的工作原理!

谢谢大家,我感到被宠坏了! 你们真好!

我会继续学习Haskell!

is7*_*s7s 8

有没有其他方式以更易读的方式实现算法?

是.

import Data.List

compress :: Eq a => [a] -> [a]
compress = map head . group
Run Code Online (Sandbox Code Playgroud)

map head . group基本上是\xs -> map head (group xs).group xs将创建列表列表,所有相等的连续元素在列表中组合在一起.map head然后根据需要将head这些列表中的s丢弃.