Функциональное программирование |
Функциональное программирование всегда привлекало меня в противопоставлении к императивному.
Я очень часто обсуждаю различные аспекты функционального программирования на различных ветках на Базарной площади.
Но хотелось бы собрать всех заинтересованный этой темой в одной ветке.
Я думаю что настало время открыть такую тему. И вот почему.
Исторически функциональное программирование появилось практически вместе с императивным.
Вторым языком после фортрана был лисп.
Но увы, функциональное программирование надолго было уделом исследовательских институтов или специализированных приложений (Искусственный Интеллект)
Конечно не надо считать весь мир дураками из за того что развитие пошло по пути языков Алгол семейства.
Для этого были вполне обьективные причины. Функциональные языки слишком близки к человеку и слишком далеки от машины.
Они сьедают в десятки раз больше рессурсов чем императивные языки.
Вспомните претензии, предявляемые к java - первому императивному языку с виртуальной машиной и сборщиком мусора, толкаемому большими корпорациями в mainstream.
Жутко тормозит, и жрет всю память какая есть. А ведь функциональные языки (далее ФЯ) все без иключения имеют сборщик мусора, виртуальную машину.
Многие из них (семейство лисп) еще и динамические, что только усугубляет положение.
Вполне естественно что появившись более полусотни лет назад они надолго опередилли свое время.
Для широкого распространения ФЯ нужны гигабайты дешевой памяти и гигагерцы дешевых процессоров.
Прошло более 50 лет, прежде чем такие требования к железу стали реальностью.
Это время наступило. СЕЙЧАС.
Добро пожаловать в новую эру программирования.
Jack Of Shadows
Всего в теме 5502 сообщения
Добавить свое сообщение
Отслеживать это обсуждение
- Средства разработки. Языки программирования.
- Delphi 4 or Delphi 5
- Что приобрести в качестве средства разработки?
- Delphi6
- Delphi vs PowerBuilder
- Сравнение компиляторов
- Вот и вышла Delphi 7... Вы рады?
№ 3272 06-10-2007 13:23 | |
Ответ на »сообщение 3256« (Денис Зайцев)
___________________________
как Вы, как функциональщик, к yield return относитесь?
Это движение в сторону ФП?
Положительно отношусь. yield return это же самые обычные closures, просто приспособленые к идиотскому синтаксису императивных языков.
Да, closures нечистые функции. Но зато очень и очень удобный механизм управления состоянием. А работать с состояниме приходится всем, и нам и вам. И никуда от него не деться. Так лучше иметь удобные инструменты для работы с ним, нежели зарывать голову в теоретическую чистоту. Лучше иметь монады, closures (которые в хаскеле сделаны через те же монады), чем язык непригодный для практики.
№ 3271 06-10-2007 13:16 | |
Руслан:
Монады это не только ценный мех, ээ ввыод/вывод :)))
Монады это например списки, и еще много чего. Зачем их убирать из хаскеля ?
Даже больше вам скажу, зачем их ВООБЩЕ знать чтобы писать на хаскеле ?
Вы ведь не считаете что рядовой пользователь телевизора должен знать и понимать микросхемы, поскольку видите ли телевизор этот унутри содержит эти страшные и непонятные микросхемы ?
Уверяю вас, вы можете переписать на хаскеле весь код, написанный вами за всю вашу жизнь, ни разу не произнеся слово "монад" и уже тем более не пытаясь монаду сделать самому, также как и пользователь телевизора может смотреть его всю жизнь ни разу не произнеся слово "микросхема", и уж тем более не пытаясь ее сделать :))
№ 3270 06-10-2007 13:07 | |
Илья:
С "переменными" которые принимают значение только один раз в ФЯ как раз таки значительно проще. :)) Их не надо никуда передавать как параметры.
x = blabla
И после этого в остальных функциях этот x виден. Ведь он гарантированнно не меняется, стало быть при обращении к нему чистота функции не нарушается.
Если вам по какой то причине не хочется светить x глобально, обьявляете его внутри тела функции через
let x = blabla
либо
blabla x blaba x blala x
where x = somethingelse
Trurl:
break в хаскеле не нужен, поскольку его обязанности выполняет...ленивость хаскеля.
То есть цикл будет выполняться не полностью а лишь до тех пор пока не достигнут желаемый результат.
Так например
take 5 (filter even [1..100])
Берет первые 5 четных чисел из списка 100 чисел. Однако filter при этом не будет бегать по всему списку выбирая ненужные четные числа, а остановится когда первые пять будут найдены.
Вот вам и ваш break
№ 3269 06-10-2007 10:57 | |
Ответ на »сообщение 3260« (Trurl)
___________________________
List comprehensions не основаны на do-нотации и не имеют осношения к монадам. Это раз.
Вот два варианта одной и той же вещи:
test1 = do a <- [1, 2]
b <- "abc"
return (a, b) и test2 = [ (a, b) | a <- [1, 2], b <- "abc" ] Результат один и тот же: [(1,'a'),(1,'b'),(1,'c'),(2,'a'),(2,'b'),(2,'c')] да и сходство явное есть. Вам не кажется, что List comprehensions - это синтаксический сахар для do-нотации.
Ну или можно сказать по другому: do-нотация - синтаксический сахар для monad comprehensions, частным случаем которых будут list comprehensions...
№ 3268 06-10-2007 10:38 | |
Вопрос к знатокам Haskell.
Дано: Функция, возвращающая списко пар и функция и группирующая.
tokenize :: [(String, Integer)]
group :: [(String, Integer)] -> [(String, Integer)]
Для данных пар первй элемент является ключем, а второй значением.
Необходимо объеденить пары с одинаковыми ключами суммируя значения.
Я функцию group реализовал так:
group [] = []
group ((a,b):xs) =
[merge ((a,b) : (filter (\(x,y) -> a == x) xs))] ++ group (filter (\(x,y) -> a /= x) xs)
where
merge ((a,b):xs) =
(a, b + f xs)
where
f [] = 0
f ((a, b):xs) = b + f xs
Входные данные:
tokenize =
("sdfs",1):("sds",1):("sdfg", 1):("sdfs",2):("sdfs",1):[]
Вопрос: Можно ли написать функцию group как-нибудь по-проще? Особенно так, чтобы можно было выделить из списка совпадающие / несовпадающие элементы за один проход, а не за два? Спасибо.
№ 3267 06-10-2007 10:32 | |
Ответ на »сообщение 3261« (Trurl)
___________________________
А теперь представим, что в Haskell добавили return. Для удобства ;-)
hasItem a x = any map \y-> if (y == x) then break true else false
Ещё бы понять, что Вы имели этим в виду? Упомянули про удобство с return, использовали какой-то break...
Ответ на »сообщение 3263« (Стэн)
___________________________
Какого удобства???
hasItem a sx = any (\y -> y == a) sx
Ну ежели на то пошло, то так:
hasItem a sx = any (== a) sx или вапще так: hasItem a = any (== a) хотя это уже менее наглядно...
№ 3266 06-10-2007 10:25 | |
Ответ на »сообщение 3263« (Стэн)
___________________________
Ответ на »сообщение 3261« (Trurl)
Какого удобства???
вот и я ниже столько постов спрашиваю - КАКОГО... брейка... :-)
№ 3265 06-10-2007 10:24 | |
Ответ на »сообщение 3260« (Trurl)
___________________________
List comprehensions не основаны на do-нотации и не имеют осношения к монадам. Это раз.
А как же элементы do-нотации, которые используются в List comprehensions вместе с монадой Maybe?
Монады в Хаскелле - это не просто классы. Это два.
Классы с синтаксической поддержкой компилятора...
Любой, даже не очень опытный функциональщик, легко реализует классы Monad и MonadPlus, но никакой опыт не поможет ему реализовать IO или ST. Это три.
Это почему же? Интересно, кто же всё таки реализовал IO и ST? Или они всё ещё нереализованы? Вапще непонятное утверждение...
Императив можно имитировать и без всяких монад. Это четыре.
Впорос ставился о Хаскелле, в котором императивный ввод-вывод реализован с помощью монад. К чему это Ваше четыре?
№ 3264 06-10-2007 10:23 | |
Ответ на »сообщение 3262« (Geniepro)
___________________________
Ответ на »сообщение 3258« (Илья Ермаков)
___________________________
В чистом функциональном коде всё изменяемое состояние должно передаваться через параметры функций и возвращаться в качестве результатов функций.
ясно...
ЗЫ. Вапще-то приведите пример кода, который Вы имеете в виду, посмотрим, как это должно выглядеть в чистом ФП.
Да нет, это я так, в общем. Писал код - и подумалось... Код-"виновник" вопроса приводить смысла нет - диспетчер автопамяти обероновского рантайма :-)
Можете даже задействовать циклы и break'и, да хоть даже и yeald'ы, что бы ни было... ;о)
Боже упаси 8-)
№ 3263 06-10-2007 10:19 | |
Ответ на »сообщение 3261« (Trurl)
___________________________
>>>А теперь представим, что в Haskell добавили return. Для удобства ;-)
hasItem a x = any map \y-> if (y == x) then break true else false
Какого удобства???
hasItem a sx = any (\y -> y == a) sx
Добавить свое сообщение
Отслеживать это обсуждение
Дополнительная навигация: |
|