gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 16:52:00 24 4
gpt4 key购买 nike

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

>compress "aaaabbbbccccddddd"
"abcd"
>compress [1,1,1,1,2,3,4,4,4,4]
[1,2,3,4]

这是我写的:

compress :: (Eq a) => [a] -> [a]
compress [] = []
compress x = filter ( (head x) `notElem` ( compress $ tail x ) ) x

编译器说:

Couldn't match expected type a -> Bool' with actual type Bool'

compress中,我尝试从头到尾递归地选取新元素。 (也许像回溯?)

我的算法有问题吗?是否有其他方法以更具可读性的方式实现算法?(例如:括号应该放在哪里?或 $ )

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

<小时/>

感谢 Lubomir 的帮助,我更正了我的代码:

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

它有效!

谢谢大家,我感觉被宠坏了! 你们真是太好了!

我会继续学习 Haskell!

最佳答案

Is there alternative way to implement the algorithm in a more readable way?

是的。

import Data.List

compress :: Eq a => [a] -> [a]
compress = map head . group

map 头。 group 基本上是 \xs -> map 头(group xs)group xs 将创建一个列表列表,其中所有相等的连续元素都分组在一个列表中。然后,map head 将获取这些列表的 head,并根据需要丢弃其余部分。

关于haskell - Haskell 学习者关于过滤和折叠的小问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21304280/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com