list - 给定一个字符串,获取元组列表(字符,字符连续出现多少次) - Haskell
问题描述
例如: ʺaaaabbaabʺ->[('a',4),('b',2),('a',2),('b',1)]列表,不使用 (++)。
这是我到目前为止所拥有的
task2 (x:xs) = foldr (\c [(symbol, count)] -> if symbol == c then [(symbol, count+1)] else [(symbol, count)]) [(x, 1)] xs
问题是我真的不明白如何让它在“if”语句为 False 之后转到列表的下一个元素
解决方案
将 step 函数编写为内联 lambda 表达式可能不是最好的举措。它可以工作,但这会导致很长的代码行。
单独编写 step 函数更容易,如下所示:
task2 :: String -> [(Char,Int)]
task2 cs = foldr stepFn [] cs
where
stepFn c [] = [(c,1)] -- simple case
stepFn c ((c1,n1) : ps) = -- please try to write the rest ...
if (c == c1) then (c1,1+n1) : ps else (c,1) : (c1,n1) : ps
测试:
$ ghci
GHCi, version 8.8.4: https://www.haskell.org/ghc/ :? for help
λ>
λ> :load q69871708.hs
[1 of 1] Compiling Main ( q69871708.hs, interpreted )
Ok, one module loaded.
λ>
λ> task2 "aaaabbaabrrrzz"
[('a',4),('b',2),('a',2),('b',1),('r',3),('z',2)]
λ>
λ> task2 "a"
[('a',1)]
λ>
λ> task2 ""
[]
λ>
推荐阅读
- canvas - 将小部件放在 Canvas Tkinter 上
- .net-core - 无法获取 dotnet --list-sdks in linux mint os 中列出的 dotnet 核心预览版本
- linux - 了解来自 docker 容器的 I/O 磁盘访问
- kotlin - 如何使用 Kotlin 协程抓取递归结构?
- python - 为数据存储实体创建 python 模型
- javascript - 从数据列表中添加/删除项目两次或更多的问题
- c++ - 在 C++ 中将 int 转换为 char 时“缩小”如何工作?
- node.js - 我可以在passport.js中反序列化不同的用户,比如学生和管理员吗?
- html - 使用来自 ESP32-CAM 的 C++/Qt 将HTML 捕获为视频流
- c++ - 如何在 Vulkan 中获取下一帧呈现时间