Haskell. Реализуйте функцию, которая принимает строку в качестве входных данных и расширяет ее сжатое представление - PullRequest
0 голосов
/ 10 ноября 2019

Реализация функции (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 : []

Но моя программа находится в строке с одним символом, например Input: myData2Fun "c" возвращает Output: [Multiple 'c' 1] вместоВыход: [Одиночный 'c']. Помогите найти ошибку и исправить код.

1 Ответ

1 голос
/ 10 ноября 2019

Как подсказывает @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']
...