haskell - 哈斯克尔。实现一个将字符串作为输入并扩展其压缩表示的函数
问题描述
实现一个函数 (myData2Fun),该函数将字符串作为输入,并根据编码序列长度的规则扩展其压缩表示。压缩的本质是将连续相同的字符组合成一组。例如:
1. Input: myData2Fun "C"
Output: [Single "C"]
2. Input: myData2Fun "cvvccf"
Output:[Single 'c',Multiple 'v' 2,Multiple 'c' 2,Single 'f']
还需要实现解决问题所需的数据类型。
我正在尝试按如下方式解决问题:
data MyData2 = Multiple Char Integer | Single Char deriving(Show)
myData2Fun (h:t) = fff h t 1
fff x (h:t) acc
| h == x = fff x t (acc + 1)
| h /= x && acc > 1 = Multiple x acc : fff h t 1
| h /= x && acc == 1 = Single x : fff h t 1
fff x [] acc
| acc>0 = Multiple x acc : []
| acc == 0 = Single x : []
但是我的程序在一行中只有一个字符,例如输入:myData2Fun "c" 返回输出:[Multiple 'c' 1],而不是输出:[Single 'c']。帮我找出错误并修复代码。
解决方案
正如@chepner 提示的那样,您可以使用它Data.List.group
来简化您的工作,同时保持您的MyData2
数据类型
import Data.Bool (bool) -- ternary operator
import Data.List (group)
f s = map (\g@(c:_) -> let n = length g
in bool (Single c) (Multiple c n) (n > 1)) (group s)
*Main> f "cvvccf"
[Single 'c',Multiple 'v' 2,Multiple 'c' 2,Single 'f']
推荐阅读
- node.js - 切换到 Docker 后 Node 的缓存问题?
- html - 将文本元素的宽度继承给换行 HTML
- sql - 我们如何使用 XML 文件识别来自数据库中哪些表和列的值
- php - laravel 从数据库中检索数据需要太多时间
- c# - 如何以 M YYMMDD SS 方式获取日期
- apache-spark - Spark Yarn 模式不起作用在执行程序阶段引发 java Null Pointer 异常
- os.walk - Python:os.walk() 将文件放置在意外位置
- angular - 如何在 Angular 6 中的单击事件上设置 matInput 元素的自动对焦?
- python - Python中对象类的方法是什么?
- graphql - 如何将 GraphQL 查询从 Node.js 发送到 Prisma