и еще про стиль кодирования на haskell
Feb. 11th, 2008 12:26 amПонравилось у
deni_ok.
Нужно вычислить вот такую формулу:
Плохая, негодная функция получилась - для больших n память переполняется. Засада в том, похоже, что foldl' форсирует операцию композиции функций (.), а не собственно вычисление f.
И после некоторых размышлений получается окончательный вариант:
Вывод: проще нужно быть.
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
Нужно вычислить вот такую формулу:
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.
Вывод: проще нужно быть.