- 1
append x = foldr (map (:) x) id
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+116
append x = foldr (map (:) x) id
Вспомнилась глава про изображения из SICP
Код украсть захотел...
И буду загребать бабло!!1
Как в функцию map, принимающую один аргумент, передают функцию (:) принимающую 2 аргумента?
Тогда как это может быть первым аргумертом foldr?
Он считает, что компилируется:
Там же написан более приятный вариант
>Там же написан более приятный вариант
>append = flip $ foldr (:)
Ты что не видиш, что это совсем другое. Этот вариант не один элемент x присобачивает, а много append [1..5] [2..5]
http://ideone.com/9QiLS
ну адаптируй, flip теперь не нужен (первый аргумент в конец): foldr (:) . (:[])
> (:) x
Больше похоже, что x вторым параметром для map передаётся. А частичное применение делается так: (:x)
На самом деле благодаря каррированию все функции в хаскеле - функции одного аргумента. (:) - функция одного аргумента, возвращающая при частичном применении другую функцию. Поэтому x должен быть списком. В результате (map (:) x) будет порождать список функций, принимающих на вход список, и возвращающих список, что и отражено в типе [[a]->[a]]. Эти функции будут приклеивать разные элементы из x.
А вот такая генерация списка функций - это на времени компиляции и на производительности кода не сказывается?
http://fmapfixreturn.wordpress.com/2008/07/09/comonads-in-everyday-life/
Поднимают (и решают) такую проблему:
"So anyway, you’re describing the structure of your website twice, in perhaps very different formats"