如何在Haskell中连续打印相同的字符

时间:2019-04-17 13:38:12

标签: haskell

当我输入gggiiss作为输入时,输出应为ggg。

round :: String -> String
round []=[]
round [x]=[x]
round (x:xs) = if xs == x then [x] ++ xs + round(xs)
else [x]

上面的代码是我写的,但是我有很多我不理解的错误。有人知道如何纠正吗?鉴于代码的第一行是强制性的

1 个答案:

答案 0 :(得分:4)

round :: String -> String

您说您的函数将字符串作为输入并产生一个字符串作为输出。这很好,并且与您的round "gggiiss" == "ggg"示例一致。

round [] = []

您的基本情况是一个空列表输入,是一个空列表输出,听起来不错。

round [x] = [x]

单个元素的另一个基本情况。所以我想这意味着下一种情况将需要两个或多个元素,对吗? ...

round (x:xs) = ...

哦,不,这是怎么回事?您只需要一个元素(xs可以是[])。您可能想要两个元素,列表round (x1:x2:xs) ...的其余部分。

if xs == x 

那没有道理。您无法将列表xs(例如"ggiiss")与单个值x(例如'g')进行比较。如果您使用了我上面显示的x1x2,那么x1 == x2就很有意义,因为它们都是字符。

then [x] ++ xs + round(xs)

同时添加两个字符串xs + round xs是什么意思?一个更明智的策略可能是串联then [x1] ++ round (x2:xs)。我保留了x2,因此在递归的情况下,您需要比较正确的字符。

else [x]

这可能是复制/粘贴问题,但是应该else缩进then。最终的代码是:

rnd :: String -> String
rnd []=[]
rnd [x]=[x]
rnd (x1:x2:xs) = if x1 == x2 then [x1] ++ rnd(x2:xs) else [x1]

P.S。出于多种原因,您正在投票。我正在猜测,但是其中最主要的是您没有发布完整的“代码在这里”,“这是我的意图”,“这是我在调用代码的方式”和“错误在这里”的完整内容。 ”。 SO非常明确地要求用户使用代码发布错误和期望,并且在这种情况下用户变得不安。