Haskell 哈斯克尔。实现一个函数,该函数将字符串作为输入并扩展其压缩表示形式
实现一个函数(myData2Fun),该函数接受字符串作为输入,并根据编码序列长度的规则扩展其压缩表示形式。压缩的本质是将连续的相同字符组合成一组。例如:Haskell 哈斯克尔。实现一个函数,该函数将字符串作为输入并扩展其压缩表示形式,haskell,haskell-stack,template-haskell,haskell-platform,haskell-snap-framework,Haskell,Haskell Stack,Template Haskell,Haskell Platform,Haskell Snap Framework,实现一个函数(myData2Fun),该函数接受字符串作为输入,并根据编码序列长度的规则扩展其压缩表示形式。压缩的本质是将连续的相同字符组合成一组。例如: 1. Input: myData2Fun "C" Output: [Single "C"] 2. Input: myData2Fun "cvvccf" Output:[Single 'c',Multiple 'v' 2,Multiple 'c' 2,Single 'f'] 还需要实现解决问题所需的数据类型 我试图解决以下问
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”返回输出:[多个“c”1],
而不是输出:[单个'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']
此处:
| acc>0=多个x acc:[]| acc==0=单个x:[]
。在最后,将acc==0
映射到单个x
。这看起来不对。acc
发生的次数不是吗?怎么可能是0?它从1开始增加,所以AFAICS是不可能的。通常,为了能够更清楚地看到代码,您可以尝试垂直对齐相关的代码片段。e、 喜欢。(或者试试,它有更好的编辑器)为什么要使用冗余的单个
构造函数?如果可以使用数据.List.group
,这会变得更简单。感谢您的解决方案!这是一个美丽的方式。