- 1
foldr ((.) . (:)) id
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+119
foldr ((.) . (:)) id
Как можно операцию прикрепления элемента к голове (возвращающую список) композиционировать с операцией композиции (принимающей две функции)?
вот тип выражения, может, поможет:
т.е. в результате получаем функцию, которая принимает на вход элемент и функцию, возвращающую список, и возвращает новую функцию, возвращающую список где a = a, b = a1 -> [a]
> В печальном итоге получаем функцию, которая первым параметром принимает подклеиваемый элемент x, вторым аргументом - некую функцию h с одним параметром, и возвращает функцию, которая при вызове с параметром y вызовет функцию h и приклеит к результату в начало x.
Основной недостаток ФЯ - хрен объяснишь словами что тут происходит. У императивных такие объяснения выглядят попроще :)
Однако умные дядки в хороших книжках как-то умудряются раскладывать по полочкам даже самый замудрёный матан. Бесконечно уважаю таких людей.
Однако, фраза во второй главе книги: "Когда Карри ознакомился с работами Шейнфинкеля, он предпринял попытку с ним связаться, но к этому времени Шейнфинкель оказался в психиатрической лечебнице" как-то слегка напрягла :))
Так что мало разложить по полочкам, нужно ещё суметь не сойти с ума.
Первой функцией у нас является (:), пропустив через него аргумент получим (x:) - функцию, которая приклеивает элемент x в начало списка.
Второй функцией является композиция (.). Первым аргументом ее будет функция (x:). Получится функция, принимающая функцию от одного аргумента, которая вызывает ее, передавая результат (x:), т.е. приклеивая элемент к результату.
В печальном итоге получаем функцию, которая первым параметром принимает подклеиваемый элемент x, вторым аргументом - некую функцию h с одним параметром, и возвращает функцию, которая при вызове с параметром y вызовет функцию h и приклеит к результату в начало x.
foldr, пробежав по списку соберет цепочку из таких функций и в результате мы будем иметь функцию, которая подклеивает к своему аргументу все элементы исходного списка...
P.S. Проще и понятнее было бы записать все это в виде формулок, но это скучно :)
P.P.S. Объяснение хреновое, я знаю :(
А почему в печальном? Наоборот весело же. :)
Но короче да, я понял, я ошибся, сразу применив : к двум аргументам, получая на выходе список, а не функцию.
> и возвращает функцию, которая при вызове с параметром y вызовет функцию h и приклеит к результату в начало x.
Не наоборот? (f.g)(x) = f(g(x)) же, я так понял?
(извините за быдлятскую запись функции через скобочки)
А получаем мы чето типа такого:
Аналог на C:
Не, ну мне больше нравится аналог на си или хотя бы Хаскелевый (\f a b c = f (a b c)), чем сиськи.
Но конечно вариант (.) . (.) больше подходит для того что бы похвастаться во дворе перед ребятами, мол я у хаскеля сиськи потрогал.
Или если если присутствует коммент с явным видом (но лишняя строчка для поддержки).
А в целом, скобочки рядом с "." - моветон. \f g x -> f . g x - еще читабельно.
(.) . (.) . (.)
Воистину на Хаскелл можно написать что угодно.
а сиськи HaskellGovno: (.) . (.) == (.) (.) (.)