gpt4 book ai didi

string - 将输入列表中的每个连续元素比前一个元素重复一个

转载 作者:行者123 更新时间:2023-12-03 23:07:43 25 4
gpt4 key购买 nike

我想将输入字符串中的每个连续字符比前一个字符重复一个,从第一个字符的一次出现开始:

例如

rep "abcd" == "abbcccdddd"

我为 编写了此代码,但这不适用于 String,但会为 IntChar 生成正确的结果。

rep [] =[]
rep (x:xs) =[ (x:xs)!!y| y<-[0..(length xs)] , _<- [1..y+1]]

我该如何解决这个问题?

最佳答案

你可以先 zip 列表[1..]与您的列表,然后申请 replicate concat 结果:

rep xs = concatMap (uncurry replicate) $ zip [1..] xs

运行示例:

Prelude> let rep xs = concatMap (uncurry replicate) $ zip [1..] xs
Prelude> rep "abcd"
"abbcccdddd"

这个想法很简单,我们将每个元素关联到它应该重复的次数。

zip函数的类型为[a] -> [b] -> [(a, b)] ,因此它需要两个列表并返回一个对列表,其中第一个元素来自第一个列表,第二个元素来自第二个列表。在我们的例子中,结果类型为 [(Int, a)]a取决于论点。

replicate :: Int -> a -> [a]函数采用一个表示长度的整数和一个元素 x并生成一个列表 [x, x, x, ..., x]给定长度。

uncurry函数采用类型 a -> b -> c 的函数,即有两个参数,并将其转换为类型为 (a, b) -> c 的函数,即一个参数是一个元组。所以uncurry replicate类型为(Int, a) -> [a] .

现在类型匹配,您可以 map zip 上的函数ed 列出了获得 [[a]]然后使用 concat连接结果。 concatMap 只是 concat . map 的简写.

或者不使用zip然后map您可以使用 zipWith 功能:

rep xs = concat $ zipWith replicate [1..] xs

请注意,您的解决方案似乎工作正常:

Prelude> let rep [] = []; rep (x:xs) = [ (x:xs)!! y | y <- [0..length xs], _<-[1..y+1]]
Prelude> rep [1,2,3]
[1,2,2,3,3,3]
Prelude> rep "abcd"
"abbcccdddd"

如果您有一个无法产生正确结果的示例,请将其发布在您的问题中

但是效率很低。您应该避免使用!!length当使用列表时,更喜欢像 map 这样的东西和fold s。

此外,我不相信上述函数可以为[Int]产生正确的结果。但不适用于String出于一个简单的原因:该函数是多态的,因此根据参数性,列表包含的元素类型并不重要,只关心其长度,结果将始终具有相同的形状(如果您看到该函数从不“查看“/”对元素进行操作,它只是移动它们;它执行完全相同的操作,而与它们的特定类型无关。)

关于string - 将输入列表中的每个连续元素比前一个元素重复一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32431400/

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