Упрощение уродливой функции в Haskell - PullRequest
3 голосов
/ 03 декабря 2010

Я определил функцию f1

f1 p = foldl (\x y -> x ++ y ++ "\t") "" (map (foldl (++) "") p)

, которая будет принимать

[["4","0","1"],["5","2","3"]]

и давать

"401\t523\t"

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

Ответы [ 2 ]

9 голосов
/ 03 декабря 2010

Состав функции - твой друг. Так интеркалирует, из Data.List

f1 = intercalate "\t" . map concat

Редактировать: упс, неправильно прочитал ваш вывод. Вы хотите "\ t" в конце всех из них, а не только между ними. В этом случае это ближе к

f1 = concat . map ((++ "\t") . concat)
3 голосов
/ 03 декабря 2010

В качестве предложения для подхода к решению чего-то похожего в будущем (дополняющего фактическое решение Карла), вы могли бы посмотреть, как библиотека Haskell решает проблему.Например, Data.List.unwords делает что-то похожее на то, что вы хотите.

Итак, вы можете попробовать поискать:

http://hackage.haskell.org/packages/archive/base/4.3.0.0/doc/html/Data-List.html

Поиск unwords в этом документевы заметите, что есть ссылка на источник.Нажатие там приведет вас к источнику того, как библиотека реализует его.Обычно эта функция невелика и может дать вам некоторые идеи о том, как обобщить (или специализировать) вашу функцию из библиотеки.

...