Haskell 哈斯克尔。实现一个函数,该函数将字符串作为输入并扩展其压缩表示形式

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'] 还需要实现解决问题所需的数据类型 我试图解决以下问

实现一个函数(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”返回输出:[多个“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
,这会变得更简单。感谢您的解决方案!这是一个美丽的方式。