首页 > 解决方案 > 如何在haskell中连续打印相同的字符

问题描述

当我输入例如 gggiiss 作为输入时,输出应该是 ggg。

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

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

标签: haskell

解决方案


round :: String -> String

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

round [] = []

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

round [x] = [x]

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

round (x:xs) = ...

哦不,这里发生了什么?您只需要一个元素(xscan be [])。您可能想要两个元素和列表的其余部分round (x1:x2:xs) ...

if xs == x 

好吧,这没有任何意义。您不能将列表 xs(例如"ggiiss")与单个值 x(例如'g')进行比较。如果您使用了x1并且x2正如我在上面显示的那样,那么x1 == x2这两个字符都是有意义的。

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

把两个字符串加在一起是什么意思,xs + round xs?一个更明智的策略可能是串联then [x1] ++ round (x2:xs)。我在递归情况下保留了x2so,你会比较正确的字符。

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]

PS 由于多种原因,您获得了反对票。我猜,但其中最主要的是您没有发布完整的“这里是代码”、“这是意图”、“这是我调用代码的方式”和“这里是错误”。SO 非常明确地要求用户在代码中发布错误和期望,当这种情况没有发生时,用户会变得焦躁不安。


推荐阅读