haskell - 如何在haskell中连续打印相同的字符
问题描述
当我输入例如 gggiiss 作为输入时,输出应该是 ggg。
round :: String -> String
round []=[]
round [x]=[x]
round (x:xs) = if xs == x then [x] ++ xs + round(xs)
else [x]
上面的代码是我写的,但我有很多我不明白的错误。任何人都知道如何纠正它?鉴于代码的第一行是强制性的
解决方案
round :: String -> String
您说您的函数将字符串作为输入并生成字符串作为输出。这很好,并且与您的示例一致round "gggiiss" == "ggg"
。
round [] = []
你的基本情况是一个空列表输入是一个空列表输出,听起来不错。
round [x] = [x]
单个元素的另一个基本情况。所以我想这意味着下一个案例将需要两个或更多元素,对吧?...
round (x:xs) = ...
哦不,这里发生了什么?您只需要一个元素(xs
can 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)
。我在递归情况下保留了x2
so,你会比较正确的字符。
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 非常明确地要求用户在代码中发布错误和期望,当这种情况没有发生时,用户会变得焦躁不安。
推荐阅读
- webpack - 通过 SCSS 使用 Tailwind 任意值支持
- python - 删除 Pandas DataFrame 的列未按预期工作
- python - 即使使用 csr_matrix,如何使用 BinaryRelevance 修复 ArrayMemoryError?
- javascript - 如何在 Svelte 中更新 onMount() 中的值?
- elasticsearch - Elasticsearch:使用 _doc 排序滚动搜索 - terminate_early 标志
- numpy - SeedSequence.spawn 和 SeedSequence.generate_state 有什么区别
- android - 如何使用flutter GETx随着时间的变化更新timeData?
- python - 如何在 Python 的 firebase_admin 中连接两个表?
- ruby - DocuSign 需要使用不同的选项卡两次签署文档
- javascript - Javascript文件未显示在浏览器上