Как я могу сделать эту функцию более элегантной - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть функция:

wrap :: Text -> [Text] -> Text
wrap x = intercalate "" . map ((<> x) . (x <>))

Цель - обернуть каждый элемент списка заданной строкой и соединить их все вместе.

Скобки вокруг первогоАргумент в пользу карты раздражает меня, как и использование "".Поэтому мне интересно, есть ли более элегантный (или, я думаю, универсальный) способ выражения этой функции?

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Просто чтобы поставить мою шляпу на ринг ... Так как шаблон

xexxexxex

(где e s - это заполнители для элементов исходного списка), вы можете сделать это еще одним способом.вывод производится путем помещения двух x s между каждым элементом и оборачивания форзацев вручную.Итак:

wrap x es = x <> intercalate (x <> x) es <> x

Одна небольшая, но приятная особенность этого переписывания заключается в том, что для входных списков длины n это вызовет только n + 2 вызова (<>), а не 3n-1, как в ответе игрока.

0 голосов
/ 15 февраля 2019

(Скопировано из моего комментария, поэтому вопрос может быть помечен как ответ.)

Вы можете использовать foldMap f вместо intercalate "" . map f.Обратите внимание, что intercalate "" эквивалентно Data.Text.concat.

...