Есть ли простая функция, чтобы сделать строку из списка символов? - PullRequest
0 голосов
/ 03 апреля 2019

Я хочу сделать строку из списка символов [Lettre]

Например, ['1', '2', '3', 'W', '5', '5', 'W', '3'] должны быть напечатаны как (1, 2, 3, Вт, 5, 5, Вт, 3)

Теперь я использую

data Lettre = Steen Char

makeString :: [Lettre] -> String
makeString [] = ""
makeString [Steen(x)] = x:[]
makeString (Steen(x):xs) = (x:", ") ++ makeString xs

, ноЯ чувствую, что это может быть проще.

Есть ли простая функция, что-то вроде toString?Я попытался использовать некоторые функции, которые я знал, но, похоже, он не работает с моим кодом, поэтому я продолжаю использовать makeString.

Большое спасибо всем, кто может мне помочь:)

1 Ответ

7 голосов
/ 03 апреля 2019

Учитывая список символов, вы можете использовать intersperse, но это допускает только односимвольные разделители.

> "(" ++ intersperse ',' "123W55W3" ++ ")"
"(1,2,3,W,5,5,W,3)"

Для многосимвольного разделителя, такого как ", ", вы можете использовать intercalate, но тогда вам нужен список String, а не список Char.

Решение состоит в том, чтобы поднять каждый символ в строку, а затем использовать intercalate.

> "(" ++ intercalate ", " (map pure "123W55W3") ++ ")"
"(1, 2, 3, W, 5, 5, W, 3)"

Я предполагаю, что ввод является фактическим значением [Char] / String;если у вас действительно есть более сложная оболочка Char, например

newtype Lettre = Steen Char

, которая может быть выведена из вашей попытки, используйте вместо этого что-то вроде

makeString :: [Lettre] -> String
makeString xs = "(" ++ intercalate ", " [[x] | Steen x <- xs] ++ ")"
...