список данных в строку - PullRequest
0 голосов
/ 13 ноября 2018

Итак, у меня есть список данных, я знаю, что newtype в настоящее время лучше, но я добавлю к нему больше вещей.Я хотел бы преобразовать список Pack в строку.

unpack [Pack ('a','b'), Pack ('c','d') , Pack (' ', 'e') ] = "abcd e"  

Я думал об использовании foldl, но застрял, пытаясь выяснить это.

data Pack= Pack (Char, Char) deriving ( Show)
unPack:: [Pack] -> String

unpack list = foldr (\Pack (a,b) -> show a + show b -> concat) "" list

Thx дляпомощь

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Ваш тип Pack изоморфен двухсимвольным строкам:

pack2String :: Pack -> String
pack2String (Pack (a,b)) = a:[b]

string2Pack :: String -> Pack   -- partial, since String isn't limited in length
string2Pack (a:[b]) = Pack (a, b)

(Обратите внимание, что Pack (a,b) уже добавляет ненужный уровень переноса; data Pack = Pack Char Char также изоморфен Pack (Char, Char).)

Таким образом, вам на самом деле не нужно foldr;вместо этого вы можете использовать монаду со списком.

unpack :: [Pack] -> String
unpack xs = xs >>= pack2String

Если вам не нравятся монады, вы можете просто использовать функцию concatMap напрямую:

unpack :: [Pack] -> String
unpack = concatMap pack2String
0 голосов
/ 13 ноября 2018

Чтобы патч-патч на Pack xyz в лямбде, нужно поставить его в скобки:

            foldr (\(Pack (a,b)) -> ...)

То, что вы написали, на самом деле будет разбираться как два отдельных аргумента

            foldr (\(Pack) -> \(a,b) -> ...)

Далее, вы не можете объединять строки с +, это для чисел. ++ или <> для списков / строк.

Тогда синтаксис -> concat недопустим. То, что вы хотите сделать, это объединить оставшуюся часть вычисления Foldr с показанными a и b. Этот остаток является вторым аргументом функции свертывания:

            foldr (\(Pack (a,b)) rest -> show a ++ show b ++ rest)

... или короче,

            foldr (\(Pack (a,b)) -> shows a . shows b)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...