2008-02-11

yorool_gui: (Default)
2008-02-11 12:26 am

и еще про стиль кодирования на haskell

Понравилось у [livejournal.com profile] deni_ok.
Нужно вычислить вот такую формулу:
f n ( ... (f 3 (f 2 (f 1 x)))) ... )
Первый вариант решения:
chain_bad f n = foldl' (flip (.)) id $ map f [1..n]
Т.е. получить список [ f 1 .. f n ] и свернуть их в последовательность (f n) . (f (n-1)) . ... . (f 1) . id (ну или без id, если взять foldl1')
Плохая, негодная функция получилась - для больших n память переполняется. Засада в том, похоже, что foldl'  форсирует операцию композиции функций (.), а не собственно вычисление f.
И после некоторых размышлений получается окончательный вариант:
chain f n x = foldl' (flip f) x [1 .. n]
Т.е. фактически просто и без наворотов записанная формула из первой строки:  взять x, взять 1, применить к ним f, взять результат, взять 2, применить f, повторять до n.
Вывод: проще нужно быть.