Здравствуйте, BulatZiganshin, Вы писали:
__>>P.S. Что-то меня от немерле не торкнуло — видимо надо увеличить дозу .
BZ>и ждать прихода розового слоника
Похоже, так никто шутку и не оценил
Для тех, кто не в курсе, посмотрите на подпись Влада.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Курица — это инструмент, с помощью которого одно яйцо производит другие.
Re[3]: Неужели я становлюсь функциональным извращенцем?
Здравствуйте, mini_root_2, Вы писали:
__>Т.е понятно что это конструкция match/case, которая меняет местами значения двух переменных
Допустим ты пишешь GetSomeValue().Member <-> GetSomeArray()[CalculateSomeIndex()]
Простой макрос @<->(x,y) { <[ def tmp = $x; $x = $y; $y = tmp; ]> } превратит это в:
Тот что в стандартной библиотеке с помощью cache делает так, что все посторонние вычисления производятся один раз.
__>но совершенно непонятно зачем там квази цитирование
Непонятно почему тебе непонятно.
>да и вообще макросы?
Макросы затем, чтобы было удобно и эффективно. Конечно можно и без макросов, но это не так удобно, хотя и гораздо проще. Примерно так:
swap[T](ref a : T, ref b : T) { def tmp = b; b = a; a = tmp; }
swap(ref GetSomeValue().Member, ref GetSomeArray()[CalculateSomeIndex()])
__>Уря! Оказывается я еще практически здоров!
Рано радуешься. Может оказаться, что ты не только не здоров, но еще и болен чем-то более серьезным, и уже давно.
__>Вчера поставил себе немерле на моно и понял, что до настоящих извращенцев мне еще далеко (не будем показывать пальцем...).
Кто из нас извращенец еще большой вопрос.
Re[5]: Неужели я становлюсь функциональным извращенцем?
Здравствуйте, mini_root_2, Вы писали:
__>А можно глупый вопрос? Что такое монады и зачем они вообще нужны?
Если коротко и общо, то всё просто.
Было обнаружено, что много разнообразных вещей (а именно, комбинирование элементарных действий) укладывается в примерно одну схему.
Эта схема — обобщение теории групп.
Ну хорошо, в две схемы: монады и стрелки.
После чего отделили однообразные комбинаторы от содержательных вещей, что позволило
— сделать удобный сахар для комбинирования (do-нотацию и list comprehension)
— в ряде случаев абстрагироваться от класса контейнера
— сделать более стройную логику, что позволяет избежать изобретения велосипедов.
Вообще, такая идея — отделять комбинаторы от содержания — очень полезна.
Например, рекурсивная обработка списков: можно на каждый раз писать рукодельный обход, а можно использовать 4 унифицированных обхода — foldr, foldl, foldl', foldM.
Для любителей теории нужно вспомнить про ххххх-морфизмы и прочесть труд "Линзы, бананы и разлохмаченные провода".
После чего уже не возникает желания рожать алгоритмы, связанные с обходом других структур — например, деревьев. Вместо этого, в библиотеку, описывающую тип дерева, добавляются соответствующие функции для построения ана- и катаморфизмов. А дальше пользователь с их помощью выразит всё, что душе угодно.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[6]: Неужели я становлюсь функциональным извращенцем?
Здравствуйте, Кодт, Вы писали:
К>Для любителей теории нужно вспомнить про ххххх-морфизмы и прочесть труд "Линзы, бананы и разлохмаченные провода".
А можно пару примеров ххххх-морфизмов из жизни? Труд ниасилил.
now playing: Mutt — You'll See
Re[4]: Неужели я становлюсь функциональным извращенцем?
Здравствуйте, Vermicious Knid, Вы писали:
__>>но совершенно непонятно зачем там квази цитирование VK>Непонятно почему тебе непонятно.
__>>Уря! Оказывается я еще практически здоров! VK>Рано радуешься. Может оказаться, что ты не только не здоров, но еще и болен чем-то более серьезным, и уже давно.
__>>Вчера поставил себе немерле на моно и понял, что до настоящих извращенцев мне еще далеко (не будем показывать пальцем...). VK>Кто из нас извращенец еще большой вопрос.
Ты можешь обойтись без перехода на личности? Это очень сложно для тебя, или ты все-таки справишься?
Re[7]: Неужели я становлюсь функциональным извращенцем?
Здравствуйте, EvilChild, Вы писали:
К>>Для любителей теории нужно вспомнить про ххххх-морфизмы и прочесть труд "Линзы, бананы и разлохмаченные провода". EC>А можно пару примеров ххххх-морфизмов из жизни? Труд ниасилил.
foldr — катаморфизм для списков (др. словами, катаморфизм обходит рекурсивный контейнер и комбинирует значения с помощью переданной функции).
unfoldr — анаморфизм для списков (др. словами, анаморфизм генерирует развесистую структуру данных из входного значения)
Аналогичные по смыслу функции можно написать для более сложных структур данных. Их можно даже получать автоматически (см. статью о бананах в космосе).
Re[8]: Неужели я становлюсь функциональным извращенцем?
Здравствуйте, EvilChild, Вы писали:
EC>Здравствуйте, Кодт, Вы писали:
К>>Для любителей теории нужно вспомнить про ххххх-морфизмы и прочесть труд "Линзы, бананы и разлохмаченные провода". EC>А можно пару примеров ххххх-морфизмов из жизни? Труд ниасилил.
Катаморфизм — это сворачивание структуры.
Вместо каждого конструктора ( : ) подставляем двухместную функцию, а вместо конструктора [] — нульместную (т.е. значение)
Пример 1: сумма
sum [] = 0
sum (x : xs) = x + sum xs
sum xs = foldr (+) 0 xs
(на самом деле, и сумму, и длину лучше вычислять энергично, с помощью foldl' — но это в силу ассоциативности и коммутативности операции сложения).
Всякую-разную арифметику — цепные дроби, например — тоже можно сюда отнести.
-- цепная дробь
-- chain [a,b,c,d] = a+1/(b+1/(c+1/(d)))
chain xs = result
where
(Just result) = foldr f t
t = Nothing -- терминальное значение
f x Nothing = Just x -- обрабатываем последнее значение
f x (Just y) = Just (x + 1/y) -- обрабатываем результат рекурсии
-- схема Горнера для многочленов
-- horner x [a,b,c,d] = a + bx + cxx + dxxx = a+x*(b+x*(c+x*(d+x*0)))
horner x coeffs = foldr (\c p -> c+x*p) 0 coeffs
Как, кстати, и фильтры — вообще-то, это уже хиломорфизмы (превращающие один список в другой)
-- берём голову списка, до тех пор, пока предикат выполняется
takeWhile predicate xs = foldr f [] xs
where
f x rest = if predicate x then (x : rest) else []
-- оставляем только те элементы списка, для которых предикат выполняется
filter predicate xs = foldr f [] xs
where
f x rest = if predicate x then (x : rest) else rest
-- или, с каррингом,
f x = if predicate x then (x:) else id
Анаморфизм — это порождение структуры из затравки.
Есть некая затравка; функция, порождающая из затравки аргументы для конструктора : и продолжения, либо признак остановки (нуль аргументов для конструктора [])
Сам комбинатор выглядит так
unfoldr f x0 = -- штатный
case (f x0) of
Nothing -> []
| Just (y0, x1) -> y0 : unfoldr f x1
-- аналогично, для дерева с нуль-листьями
data BinTree0 a = BTNull | BTNode a (BinTree0 a) (BinTree0 a)
-- для простоты, используем всё тот же вариантный тип Maybe
unfoldBT0 f x0 =
case (f x0) of
Nothing -> BTNull
| Just (y0,x1,x2) -> BTNode y0 (unfoldBT0 f x1) (unfoldBT0 f x2)
-- для дерева с тремя типами узлов (нуль-листья, листья с данными, узлы с ключами)
data BinTree1 a b = BTNull | BTLeaf a | BTNode a (BinTree1 a b) (BinTree1 a b)
-- здесь уже нужен трёхвариантный тип - например, комбинация из Maybe и Either
unfoldBT1 f x0 =
case (f x0) of
Nothing -> BTNull
| Just (Left y) -> BTLeaf y
| Just (Right (z,x1,x2)) -> BTNode z (unfoldBT1 f x1) (unfoldBT2 f x2)
Примеры
iterate f x0 = unfoldr (\x -> Just (x, f x)) x0
-- порождает бесконечный (ленивый) список: [x0, f(x0), f(f(x0)), ...]
tails xs = unfoldr f x0 where -- список суффиксов (применяем функцию tl до упора)
f xs = if null xs then Nothing else Just (xs, tl xs)
iterWhile p f x0 = unfoldr (\x -> if p x then Just (f x) else Nothing) x0
-- порождает список, останавливающийся по условию
-- то же самое можно выразить и так:
iterWhile p f x0 = takeWhile p $ iterate f x0
Последний пример демонстрирует сплавление (fusion) морфизмов.
Здравствуйте, Gaperton, Вы писали:
G>Эрланг — говно тормозное.
Если есть желание пошутить, то делайте пожалуйста это в специально отведённом для этого месте.
Здесь подобные сообщения могут быть рассмотрены только как провокация. Вполне удачная.
... << RSDN@Home 1.2.0 alpha rev. 749>>
Re[5]: Неужели я становлюсь функциональным извращенцем?
Эх, всё-таки жалко, что в хаскеле отказались от гоферовского обобщения: map и ++ стали операциями только над списками, а обобщённые операции теперь называются fmap и mplus соответственно.
Ну зачем они это сделали? Было так красиво и прикольно...
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[11]: Неужели я становлюсь функциональным извращенцем?
Здравствуйте, Кодт, Вы писали:
К>Эх, всё-таки жалко, что в хаскеле отказались от гоферовского обобщения: map и ++ стали операциями только над списками, а обобщённые операции теперь называются fmap и mplus соответственно. К>Ну зачем они это сделали? Было так красиво и прикольно...
Видимо, боялись отпугнуть новичков — излишне полиморфный код порождает устрашающие сообщения об ошибках. AFAIK, по этой же причине отказались от monad comprehensions в пользу list comprehensions.
К>Для любителей теории нужно вспомнить про ххххх-морфизмы и прочесть труд "Линзы, бананы и разлохмаченные провода".
barbed wire — разве не колючая проволока?
Re[7]: Неужели я становлюсь функциональным извращенцем?
Здравствуйте, Mamut, Вы писали:
G>>Эрланг — говно тормозное. Ну? Кто бежит меня арестоффать? Эй, Мамут? Ты там как, нормально пережил неконструктивную критику?
M>Пааапрашу доказательства в студию! (только IO не трогать )
Здравствуйте, BulatZiganshin, Вы писали:
G>>>>Эрланг — говно тормозное. Ну? Кто бежит меня арестоффать? А>>всё дело в сообщениях.. BZ>на этот раз Гапертон предусмотрительно зашёл Анонимом
Гапертон никогда не заходит Анонимом . Но это идея .