Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Базарная площадь
  
О разделе

Основная страница

Группы обсуждений


Тематический каталог обсуждений

Архив

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  21:39[Войти] | [Зарегистрироваться]
Обсуждение темы:
Функциональное программирование

Функциональное программирование всегда привлекало меня в противопоставлении к императивному.
Я очень часто обсуждаю различные аспекты функционального программирования на различных ветках на Базарной площади.
Но хотелось бы собрать всех заинтересованный этой темой в одной ветке.
Я думаю что настало время открыть такую тему. И вот почему.

Исторически функциональное программирование появилось практически вместе с императивным.
Вторым языком после фортрана был лисп.
Но увы, функциональное программирование надолго было уделом исследовательских институтов или специализированных приложений (Искусственный Интеллект)
Конечно не надо считать весь мир дураками из за того что развитие пошло по пути языков Алгол семейства.
Для этого были вполне обьективные причины. Функциональные языки слишком близки к человеку и слишком далеки от машины.
Они сьедают в десятки раз больше рессурсов чем императивные языки.
Вспомните претензии, предявляемые к java - первому императивному языку с виртуальной машиной и сборщиком мусора, толкаемому большими корпорациями в mainstream.
Жутко тормозит, и жрет всю память какая есть. А ведь функциональные языки (далее ФЯ) все без иключения имеют сборщик мусора, виртуальную машину.
Многие из них (семейство лисп) еще и динамические, что только усугубляет положение.
Вполне естественно что появившись более полусотни лет назад они надолго опередилли свое время.

Для широкого распространения ФЯ нужны гигабайты дешевой памяти и гигагерцы дешевых процессоров.
Прошло более 50 лет, прежде чем такие требования к железу стали реальностью.
Это время наступило. СЕЙЧАС.
Добро пожаловать в новую эру программирования.

 Jack Of Shadows

Количество сообщений на странице

Порядок сортировки сообщений
Новое сообщение вверху списка (сетевая хронология)
Первое сообщение вверху списка (обычная хронология)

Перейти на конкретную страницу по номеру


Всего в теме 5502 сообщения

Добавить свое сообщение

Отслеживать это обсуждение


Смотрите также обсуждения:
Средства разработки. Языки программирования.
  • Delphi 4 or Delphi 5
  • Что приобрести в качестве средства разработки?
  • Delphi6
  • Delphi vs PowerBuilder
  • Сравнение компиляторов
  • Вот и вышла Delphi 7... Вы рады?

  • <<<... | 3282—3273 | 3272—3263 | 3262—3253 | ...>>>
    Всего сообщений в теме: 5502; страниц: 551; текущая страница: 224


    № 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



    <<<... | 3282—3273 | 3272—3263 | 3262—3253 | ...>>>
    Всего сообщений в теме: 5502; страниц: 551; текущая страница: 224


    Добавить свое сообщение

    Отслеживать это обсуждение

    Дополнительная навигация:
    Количество сообщений на странице

    Порядок сортировки сообщений
    Новое сообщение вверху списка (сетевая хронология)
    Первое сообщение вверху списка (обычная хронология)

    Перейти на конкретную страницу по номеру
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования