这是我学习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!
有没有其他方式以更易读的方式实现算法?
是.
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丢弃.