Привет!
Вникаю в haskell по книге Real World Haskell, там встретилось такое задание - транспонировать текст в файле, т.е. файл с содержимым
transpose :: [Char] -> [Char]
transpose fc = let
-- put additional spaces to the end of the string
putSpaces s i | length s < i = putSpaces (s ++ " ") i
| otherwise = s
-- transpose one string
transStr (r:rs) (l:ls) cnt = [putSpaces r cnt ++ [l]] ++ transStr rs ls cnt
transStr (r:rs) [] cnt = (r:rs)
transStr [] (l:ls) cnt = [putSpaces [] cnt ++ [l]] ++ transStr [] ls cnt
transStr [] [] cnt = []
-- transpose all lines
transLines rs ls cnt | not (null ls) = transLines (transStr rs (head ls) cnt) (tail ls) (cnt + 1)
| otherwise = (rs, ls)
-- extract result from transLines tuple
reportResult (rs, ls) = unlines rs
in reportResult (transLines [] (lines fc) 0)
должен превратиться в
tt
rr-p -tttt -t -r
aa-u -rrrr -r -e
nn t aaaa a p
sspS tnnnn tn eo i
ppup rssss rs xr n
oota aSSSS aL tt
ss c ntttt ni rR r
eeae| srrrr sn ae e
ds p pe cs p
:fd o o(([[ os tu o
:cist srr]] s l r
t h e:: er rt t
[=iie rr([ s e R
C o r ossl] a s( e
hln|w n)): ll| ur s
aea i e lc ls ls u
rtlls ([sn o t, l
] ee sl])t lct t
sn t: inh fl
- pg= rlcc= nte rs (
(поскипано, дальше в том же духе)
Собственно, в первом блоке кода - моё решение задачи. Вопрос такой - оптимальна ли реализация с точки зрения фп и ленивых вычислений? На том же Си можно было бы написать то же самое с меньшей сложностью алгоритма (особенно это касается добавления пробелов в конец строки, если она короче, чем надо). Но может быть, благодаря ленивым вычислениям это в достаточной мере соптимизируется? Если нет - как этот код можно сделать быстрее?