首页 > 解决方案 > 哈斯克尔。实现一个将字符串作为输入并扩展其压缩表示的函数

问题描述

实现一个函数 (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']。帮我找出错误并修复代码。

标签: haskellhaskell-stacktemplate-haskellhaskell-platformhaskell-snap-framework

解决方案


正如@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']

推荐阅读