- 1
foldr ((.) . (:)) id
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+119
foldr ((.) . (:)) id
HaskellGovno 21.05.2012 01:29 # −3
bormand 21.05.2012 05:41 # +3
JavaGovno 21.05.2012 11:13 # +1
TarasB 21.05.2012 10:07 # +2
Как можно операцию прикрепления элемента к голове (возвращающую список) композиционировать с операцией композиции (принимающей две функции)?
roman-kashitsyn 21.05.2012 10:44 # +1
вот тип выражения, может, поможет:
roman-kashitsyn 21.05.2012 10:56 # 0
т.е. в результате получаем функцию, которая принимает на вход элемент и функцию, возвращающую список, и возвращает новую функцию, возвращающую список где a = a, b = a1 -> [a]
bormand 21.05.2012 11:10 # +2
> В печальном итоге получаем функцию, которая первым параметром принимает подклеиваемый элемент x, вторым аргументом - некую функцию h с одним параметром, и возвращает функцию, которая при вызове с параметром y вызовет функцию h и приклеит к результату в начало x.
Основной недостаток ФЯ - хрен объяснишь словами что тут происходит. У императивных такие объяснения выглядят попроще :)
roman-kashitsyn 21.05.2012 11:18 # 0
Однако умные дядки в хороших книжках как-то умудряются раскладывать по полочкам даже самый замудрёный матан. Бесконечно уважаю таких людей.
koodeer 21.05.2012 13:27 # +4
Однако, фраза во второй главе книги: "Когда Карри ознакомился с работами Шейнфинкеля, он предпринял попытку с ним связаться, но к этому времени Шейнфинкель оказался в психиатрической лечебнице" как-то слегка напрягла :))
Так что мало разложить по полочкам, нужно ещё суметь не сойти с ума.
TarasB 21.05.2012 13:32 # +2
roman-kashitsyn 21.05.2012 13:39 # +3
bormand 21.05.2012 13:43 # +2
TarasB 21.05.2012 14:03 # +1
bormand 21.05.2012 13:42 # 0
bormand 21.05.2012 10:52 # 0
Первой функцией у нас является (:), пропустив через него аргумент получим (x:) - функцию, которая приклеивает элемент x в начало списка.
Второй функцией является композиция (.). Первым аргументом ее будет функция (x:). Получится функция, принимающая функцию от одного аргумента, которая вызывает ее, передавая результат (x:), т.е. приклеивая элемент к результату.
В печальном итоге получаем функцию, которая первым параметром принимает подклеиваемый элемент x, вторым аргументом - некую функцию h с одним параметром, и возвращает функцию, которая при вызове с параметром y вызовет функцию h и приклеит к результату в начало x.
foldr, пробежав по списку соберет цепочку из таких функций и в результате мы будем иметь функцию, которая подклеивает к своему аргументу все элементы исходного списка...
P.S. Проще и понятнее было бы записать все это в виде формулок, но это скучно :)
P.P.S. Объяснение хреновое, я знаю :(
HaskellGovno 21.05.2012 11:29 # 0
А почему в печальном? Наоборот весело же. :)
TarasB 21.05.2012 11:47 # +2
Но короче да, я понял, я ошибся, сразу применив : к двум аргументам, получая на выходе список, а не функцию.
> и возвращает функцию, которая при вызове с параметром y вызовет функцию h и приклеит к результату в начало x.
Не наоборот? (f.g)(x) = f(g(x)) же, я так понял?
(извините за быдлятскую запись функции через скобочки)
bormand 21.05.2012 12:13 # 0
TarasB 21.05.2012 12:21 # +5
bormand 21.05.2012 12:47 # +2
А получаем мы чето типа такого:
Аналог на C:
HaskellGovno 21.05.2012 12:56 # +1
Не, ну мне больше нравится аналог на си или хотя бы Хаскелевый (\f a b c = f (a b c)), чем сиськи.
Но конечно вариант (.) . (.) больше подходит для того что бы похвастаться во дворе перед ребятами, мол я у хаскеля сиськи потрогал.
guest 21.05.2012 23:13 # 0
Или если если присутствует коммент с явным видом (но лишняя строчка для поддержки).
А в целом, скобочки рядом с "." - моветон. \f g x -> f . g x - еще читабельно.
TheHamstertamer 22.05.2012 22:12 # +3
(.) . (.) . (.)
Воистину на Хаскелл можно написать что угодно.
guest 22.05.2012 22:24 # +2
а сиськи HaskellGovno: (.) . (.) == (.) (.) (.)
TheHamstertamer 22.05.2012 22:24 # +1
guest 22.05.2012 22:31 # +3
rat4 21.05.2012 13:17 # +2
unu-foja 21.05.2012 17:51 # +2
rat4 21.05.2012 19:03 # 0