| 1 2 3 4 5 6 |
| Функциональное программирование для всех | |
| От: | Линкер Николай (перевод) | ||
| Дата: | 30.07.06 04:52 | ||
| Оценка: | 3220 (64) +4 -3 | ||
| Статья: Вячеслав Ахмечет. Функциональное программирование для всех Автор(ы): Вячеслав Ахмечет Дата: 16.09.2006 Данная статья достаточно кратко и вполне доступно, используя примеры на Java (!), знакомит читателя с базовыми понятиями функционального программирования. Авторы: Линкер Николай (перевод) Аннотация: Данная статья достаточно кратко и вполне доступно, используя примеры на Java (!), знакомит читателя с базовыми понятиями функционального программирования. quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#) |
| Re: Функциональное программирование для всех | |
| От: | dikun | ||
| Дата: | 16.09.06 20:39 |
| > Функции обозначались греческой буквой ? Это мой браузер (Opera 9.00 Build 8212 — Windows Server 2003) шутит или буква "лямбда" не напечатана? |
| Re[2]: Функциональное программирование для всех | |
| От: | StatujaLeha | ||
| Дата: | 17.09.06 04:45 |
| Здравствуйте, dikun, Вы писали: >> Функции обозначались греческой буквой ? D>Это мой браузер (Opera 9.00 Build 8212 — Windows Server 2003) шутит или буква "лямбда" не напечатана? у меня также. Причем похоже не только лямбда, там еще есть греческие буквы для обозначения правил преобразования лямбда-выражений. toAll: Может кто-нибудь знает, как лечиться? ... << RSDN@Home 1.1.4 stable SR1 rev. 568>> |
| Re[2]: Функциональное программирование для всех | |
| От: | Odi$$ey админ | ||
| Дата: | 17.09.06 05:56 |
| Здравствуйте, dikun, Вы писали: >> Функции обозначались греческой буквой ? D>Это мой браузер (Opera 9.00 Build 8212 — Windows Server 2003) шутит или буква "лямбда" не напечатана? частично исправлено — IE отображает лямбды правильно, а вот FireFox не хочет ... << RSDN@Home 1.2.0 alpha rev. 654>> |
| Re[3]: Функциональное программирование для всех | |
| От: | Centaur | ||
| Дата: | 17.09.06 06:56 | ||
| Оценка: | +1 | ||
| Здравствуйте, Odi$$ey, Вы писали: OE>Здравствуйте, dikun, Вы писали: >>> Функции обозначались греческой буквой ? D>>Это мой браузер (Opera 9.00 Build 8212 — Windows Server 2003) шутит или буква "лямбда" не напечатана? OE>частично исправлено — IE отображает лямбды правильно, а вот FireFox не хочет Нужно заменить в исходнике все вхождения
на
и аналогично для всех остальных букв. |
| Re[2]: Функциональное программирование для всех | |
| От: | Lazy Cjow Rhrr | ||
| Дата: | 18.09.06 00:56 |
| dikun, >> Функции обозначались греческой буквой ? D>Это мой браузер (Opera 9.00 Build 8212 — Windows Server 2003) шутит или буква "лямбда" не напечатана? Нет, с браузером всё в порядке. В качестве теста см: Греческие буквы в HTML &#955; λ Где-то в цепочке преобразований XML->...->HTML->View происходит лишний эскейпинг... quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#) |
| Re[3]: Функциональное программирование для всех | |
| От: | PVA | ||
| Дата: | 16.10.06 10:31 | ||
| Оценка: | ![]() | ||
Спасибо за статью!В условиях независимости от внешнего состояния оно может быть распараллелено и в традиционных случаях. Разве нет? Сериализация не поможет? А с коленки реализация не подойдет?
Аналогично для приведенного обработчика может быть реализована необходимая схема. Соответсвенно, вот это и сопутствующий текст выглядит странно.
А разве оптимизаторы нынешние не делают то же самое? Аналогично функциям высшего порядка. Шаблоны с++ + метапрограммирование? Аналогично функциям высшего порядка. Шаблоны?
Не совсем понятно, каким образом происходит вызов powerFn неявно, аналогично с инкрементом. А реализовано может быть через те же функторы. В свете изложенных соображений, что мешает програмить на с++ в ФП? newbie |
| Re[4]: Функциональное программирование для всех | |
| От: | FR | ||
| Дата: | 16.10.06 10:43 | ||
| Оценка: | +1 ![]() | ||
| Здравствуйте, PVA, Вы писали: PVA>В свете изложенных соображений, что мешает програмить на с++ в ФП? Ничего ни мешает, но это также удобно как ООП на ассемблере. |
| Re[4]: Функциональное программирование для всех | |
| От: | Lazy Cjow Rhrr | ||
| Дата: | 16.10.06 12:32 | ||
| Оценка: | 2 (1) | ||
| PVA, Начну с последнего вопроса, ок? PVA>В свете изложенных соображений, что мешает програмить на с++ в ФП? В мелких дозах ничего не мешает, в крупных — 10й закон Гринспуна. Чтобы воспользоваться преимуществами функционального программирования, вам нужно будет создать строительные блоки на C++ и работать используя только эти строительные блоки. Вместе с тем у меня возникают большие сомнения в том, что некоторые строительные блоки реализуемы эффективно и удобно или вообще реализуемы. Кроме того, такой способ приведёт к тому, что вы не сможете воспользоваться большинством оптимизаций, которые делают компиляторы функциональных языков (например, уничтожение промежуточного копирования, хвостовая рекурсия и т.п.). PVA> PVA>В условиях независимости от внешнего состояния оно может быть распараллелено и в традиционных случаях. Разве нет? Да, конечно. До тех пор, пока это будет описываться программистом _явно_. PVA> PVA>Сериализация не поможет? Не поможет. Возьмём пример на Яве. Пусть у нас интерфейс CSDescriptor:
Мы берём, и рефакторим до
Компилируем. Меняем все зависимые от этого интерфейса классы. Компилируем. Дальше выгружаем все объекты этих классов, а также всех зависимых классов, а также всех зависимых от этих классов и т.п. на диск, пишем кастомный загрузчик (который обработает нестыковки), загружаем... PVA> PVA>А с коленки реализация не подойдет? PVA>
PVA>Аналогично для приведенного обработчика может быть реализована необходимая схема. Соответсвенно, вот это PVA> PVA>и сопутствующий текст выглядит странно. Мне бы op_t принимающую любое количество параметров любого типа... PVA> PVA>
... а вместо создания экземпляра типа op_add_xX(2) я хочу писать (+2) (ну или (_ + 2)), вместо создания экземпляра типа op_add_Xx(2) хочу писать (2+) (или (2 + _)), а вместо создания экземпляра op_add_XX(2,3) я хочу писать 2 + 3. Ну и конечно передать полученные функции куда нибудь в ФВП. PVA> PVA>А разве оптимизаторы нынешние не делают то же самое? Если могут — делают, но почти всегда не могут. А не могут, потому что когда вы пишете foo(x, y), то аргументы x и y должны быть вычислены до того, как управление передастся в функцию foo. PVA> PVA>Аналогично функциям высшего порядка. Возможно у вас есть свежая идея. Поделитесь? PVA> PVA>Шаблоны с++ + метапрограммирование? Возможно у вас есть ещё одна свежая идея. Мне будет очень интересно. PVA> PVA>Аналогично функциям высшего порядка. Здесь если покопать, то лес настолько дремучий, что связываться с этим не захочется. Есть реализация продолжений и на Яве, и на C, и на C#. Но все они неуниверсальны и интрузивны для клиентского кода. Поизвращаться над своим кодом я и так могу, без продолжений (тем более что "продолжения" на списках сделает любой нормальный студент, не слишком сложная задача), а что делать с rt.jar? PVA> PVA>Шаблоны? Сопоставление с образцом уж точно не реализуемо на шаблонах. Максимум, что можно выжать, это boost::tie. PVA> PVA>
PVA>Не совсем понятно, каким образом происходит вызов powerFn неявно, аналогично с инкрементом. Это псевдокод. Можно было написать ещё Function makePowerFn(int power) { return new Function( int powerFn(int base) { return pow (base, power); } ); } как вариант. Но это тоже не Ява. Идея состоит в том, чтобы вернуть функцию, причём связанную с внешним параметром. PVA>А реализовано может быть через те же функторы. Это вы делаете вывод исходя из ошибочного предположения, что функции высшего порядка == функторы. А на самом деле функторами можно эмулировать ФВП (так же как это делает компилятор написанный на C). Я с удовольствием послушаю, как вы реализуете на функторах функцию iterate:
(ocaml) Больше чем уверен, что вы вернёте разве что функтор-интерпретатор, который будет инкапсулировать АСТ. ... << RSDN@Home 1.1.4 stable SR1 rev. 568>> quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#) |
| Re[5]: Функциональное программирование для всех | |
| От: | Кодт модератор | ||
| Дата: | 16.10.06 14:42 | ||
| Оценка: | 2 (2) | ||
| Здравствуйте, Lazy Cjow Rhrr, Вы писали: PVA>>А реализовано может быть через те же функторы. LCR>Это вы делаете вывод исходя из ошибочного предположения, что функции высшего порядка == функторы. А на самом деле функторами можно эмулировать ФВП (так же как это делает компилятор написанный на C). LCR>Я с удовольствием послушаю, как вы реализуете на функторах функцию iterate:
LCR>(ocaml) LCR>Больше чем уверен, что вы вернёте разве что функтор-интерпретатор, который будет инкапсулировать АСТ. Во-первых: а что здесь вообще можно вернуть? Какой код порождает компилятор caml? — строит AST — приводит к форме, свободной от переменных, т.е. к коду для комбинаторной машины — опять же, в каком базисе? есть ли там Y-комбинатор? — выполняет преобразования, в ходе которых создаёт концевую рекурсию, а её, в свою очередь, переводит в итерации
Во-вторых, если не следовать заданию до последней буквы, то именно итерационную версию и можно написать
... << RSDN@Home 1.2.0 alpha rev. 655>> Перекуём баги на фичи! |
| Re[5]: Функциональное программирование для всех | |
| От: | PVA | ||
| Дата: | 16.10.06 15:11 |
| Lazy Cjow Rhrr, LCR>Начну с последнего вопроса, ок? Да, конечно. Я ведь не против прояснения деталей — за тем и пришел. PVA>>Сериализация не поможет? LCR>Не поможет. Возьмём пример на Яве. Пусть у нас интерфейс CSDescriptor: LCR>Компилируем. Меняем все зависимые от этого интерфейса классы. Компилируем. Дальше выгружаем все объекты этих классов, а также всех зависимых классов, а также всех зависимых от этих классов и т.п. на диск, пишем кастомный загрузчик (который обработает нестыковки), загружаем... Ужас! Если я правильно понимаю, то ФП обладает только некоторым текущим состоянием (контекстом на входе какой-либо функции) и других зависимостей у нее нет, да? Тоесть заменить можно хоть всю программу, исключая активную функцию и ее зависимости, переданные через аргументы? (хотя, наверно, их тоже можно заменить, изменив контекст) А как в ФЯ делается "закат солнца" автоматом? LCR>Мне бы op_t принимающую любое количество параметров любого типа... Кхм, сделать-то можно, но склонен согласится с товарищем их соседнего поста с "ООП на ассемблере". PVA>>
LCR>... а вместо создания экземпляра типа op_add_xX(2) я хочу писать (+2) (ну или (_ + 2)), вместо создания экземпляра типа op_add_Xx(2) хочу писать (2+) (или (2 + _)), а вместо создания экземпляра op_add_XX(2,3) я хочу писать 2 + 3. Ну и конечно передать полученные функции куда нибудь в ФВП. Ненасытный какой Приведите, пожалуйста, более полный контекст с Вашим примером. PVA>>А разве оптимизаторы нынешние не делают то же самое? LCR>Если могут — делают, но почти всегда не могут. А не могут, потому что когда вы пишете foo(x, y), то аргументы x и y должны быть вычислены до того, как управление передастся в функцию foo. Вобщем-то, это зависит от того, чего мы хотим добиться, не так ли? x и y могут быть ссылками на объекты и вычисляться только по необходимости. PVA>>Аналогично функциям высшего порядка. LCR>Возможно у вас есть свежая идея. Поделитесь? Не думаю, что она свежая — я ее изложил в предыдущем абзаце. Если хотите выполнения только в точке использования — пусть аргумент будет ссылкой на объект. PVA>>Шаблоны с++ + метапрограммирование? LCR>Возможно у вас есть ещё одна свежая идея. Мне будет очень интересно. Я имел ввиду вычисления на этапе компиляции. Вот только что подумал что в ФП данные вычисления будут происходить в рантайме, что меняет подход к вопросу в корне. PVA>>Аналогично функциям высшего порядка. LCR>Здесь если покопать, то лес настолько дремучий, что связываться с этим не захочется. Есть реализация продолжений и на Яве, и на C, и на C#. Но все они неуниверсальны и интрузивны для клиентского кода. Поизвращаться над своим кодом я и так могу, без продолжений (тем более что "продолжения" на списках сделает любой нормальный студент, не слишком сложная задача), а что делать с rt.jar? Не будем связываться PVA>>Шаблоны? LCR>Сопоставление с образцом уж точно не реализуемо на шаблонах. Максимум, что можно выжать, это boost::tie. Да уж, нет в мире совершенства. А я в него так верил. LCR>Это псевдокод. Можно было написать ещё LCR>Function makePowerFn(int power) LCR>{ LCR> return new Function( int powerFn(int base) { return pow (base, power); } ); LCR>} LCR>как вариант. Но это тоже не Ява. Идея состоит в том, чтобы вернуть функцию, причём связанную с внешним параметром. Спасибо, посыпаю голову пеплом, я пропустил, что там возвращается функиця в оригинальном примере, а так — идея ясна. PVA>>А реализовано может быть через те же функторы. LCR>Это вы делаете вывод исходя из ошибочного предположения, что функции высшего порядка == функторы. А на самом деле функторами можно эмулировать ФВП (так же как это делает компилятор написанный на C). Если предположение ошибочно, то как функторами можно эмулировать ФВП? LCR>Я с удовольствием послушаю, как вы реализуете на функторах функцию iterate: LCR>
(2 << 8) или power(2, 8), шутка А можно реальный аналог подобной задачи? Думаю в ИЯ можно найти решение для нее без функторов (а может и с ними). А еще русскоязычные обзоры/введения/и т.д. есть на просторах? Общая картина ясна, но насколько это перспективно и в каких задачах (помимо описанных в faq, приведенном в статье)? newbie |
| Re[6]: Функциональное программирование для всех | |
| От: | FR | ||
| Дата: | 16.10.06 15:57 | ||
| Оценка: | +1 | ||
| Здравствуйте, PVA, Вы писали: PVA>А еще русскоязычные обзоры/введения/и т.д. есть на просторах? http://www.softcraft.ru/paradigm/dp/index.shtml PVA>Общая картина ясна, но насколько это перспективно и в каких задачах (помимо описанных в faq, приведенном в статье)? Даже если не будешь использовать очень полезно изучить как "взгляд с другой стороны". Это реально влияет на стиль и улучшает уровень программирования даже в чистой императивщине. |
| Re[7]: Функциональное программирование для всех | |
| От: | Andrei N.Sobchuck | ||
| Дата: | 17.10.06 05:33 | ||
| Оценка: | +1 ![]() | ||
| Здравствуйте, FR, Вы писали: FR>Даже если не будешь использовать очень полезно изучить как "взгляд с другой стороны". Это реально влияет на стиль и улучшает уровень программирования даже в чистой императивщине. Во многия знания многия печали. То биш стиль оно улучшит, но можит и добавить чувство неудовлетворения. http://www.smalltalk.ru | << RSDN@Home 1.1.4 stable SR1 rev. 568>> Я ненавижу Hibernate! |
| Re[4]: Функциональное программирование для всех | |
| От: | VladD2 модератор | ||
| Дата: | 17.10.06 15:37 | ||
| Оценка: | +1 ![]() | ||
| Здравствуйте, PVA, Вы писали: PVA>В свете изложенных соображений, что мешает програмить на с++ в ФП? На С++ можно пытаться писать в функциональном стиле. Но при этом испытываешь много боли в анальном отверсии, ведь удаление гланд через зад да еще и автогеном не самая приятная процедура. |
| Re[6]: Функциональное программирование для всех | |
| От: | Lazy Cjow Rhrr | ||
| Дата: | 18.10.06 01:49 |
| PVA, PVA>А как в ФЯ делается "закат солнца" автоматом? Идеально подходит для hot upgrade динамически типизированный функциональный язык. В Practical Common Lisp есть пример, когда программу в космическом челноке исправили прямо во время полёта. Пример на Эрланге можно глянуть здесь Автор: Lazy Cjow Rhrr (там парни корёжат программу во время установленного телефонного звонка). Ну если и этого мало, могу наконец дать ссылку на документацию, только это уже не так интересно Дата: 01.03.06 PVA> PVA>Приведите, пожалуйста, более полный контекст с Вашим примером. Пожалуйста. Вот вам задачка Автор: Mamut от Дмитрия по операциям над изображением.Дата: 04.03.06 Вот решение Автор: Трурль на Хаскеле (карринг есть).Дата: 09.03.06 Вот решение Автор: Lazy Cjow Rhrr на Эрланге (карринга нет, можно только эмулировать).Дата: 16.03.06 Разница видна невооружённым глазом. PVA> LCR>>Если могут — делают, но почти всегда не могут. А не могут, потому что когда вы пишете foo(x, y), то аргументы x и y должны быть вычислены до того, как управление передастся в функцию foo. PVA>Вобщем-то, это зависит от того, чего мы хотим добиться, не так ли? x и y могут быть ссылками на объекты и вычисляться только по необходимости. Хм. Это очень жёсткие грабли, если "вычисления по необходимости" будут давать побочные эффекты (вычисления А и Б используют общую память, А пишет в общую память, Б читает, и при ленивом исполнении Б может быть вычислено раньше). Кроме того, опасны неожиданно возникающие циклы (для вычисления А нужен вычесленный Б, а для вычисления Б нужен вычисленный А). Поэтому единственный гарантированный способ избежать таких граблей — энергичное выполнение. PVA> PVA>>>Аналогично функциям высшего порядка. LCR>>Возможно у вас есть свежая идея. Поделитесь? PVA>Не думаю, что она свежая — я ее изложил в предыдущем абзаце. Если хотите выполнения только в точке использования — пусть аргумент будет ссылкой на объект. А подробнее? PVA>Не будем связываться Standard Runtime Library для Явы. PVA>>>А реализовано может быть через те же функторы. LCR>>Это вы делаете вывод исходя из ошибочного предположения, что функции высшего порядка == функторы. А на самом деле функторами можно эмулировать ФВП (так же как это делает компилятор написанный на C). PVA>Если предположение ошибочно, то как функторами можно эмулировать ФВП? Напрямую: функторы выступают как реализация ФВП, они инкапсулируют АСТ, реализация позволяет во время создания оптимизировать это АСТ и порождать скажем шитый код (это как бы jit-компиляции). LCR>>
PVA>(2 << 8) или power(2, 8), шутка PVA>А можно реальный аналог подобной задачи? Думаю в ИЯ можно найти решение для нее без функторов (а может и с ними). Любая задача, где требуется создать конструктор функций, причём возвращаемая функция будет зависеть от переданных аргументов. Интерпретатор выражений, реализация потоков (streams, которые), процессоры естественного языка, экспертные системы и т.п PVA>А еще русскоязычные обзоры/введения/и т.д. есть на просторах? PVA>Общая картина ясна, но насколько это перспективно и в каких задачах (помимо описанных в faq, приведенном в статье)? Мне очень нравится статья Сильные стороны ФП (в оригинале "Why functional programming matters") Джона Хьюгса. ... << RSDN@Home 1.1.4 stable SR1 rev. 568>> quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#) |
| Re[7]: Функциональное программирование для всех | |
| От: | FR | ||
| Дата: | 18.10.06 05:26 |
| Здравствуйте, Lazy Cjow Rhrr, Вы писали: LCR>PVA, PVA>>А как в ФЯ делается "закат солнца" автоматом? LCR>Идеально подходит для hot upgrade динамически типизированный функциональный язык. В Practical Common Lisp есть пример, когда программу в космическом челноке исправили прямо во время полёта. Динамический типизированный не функциональный язык (например clisp |
| Re[8]: Функциональное программирование для всех | |
| От: | Lazy Cjow Rhrr | ||
| Дата: | 18.10.06 07:01 | ||
| Оценка: | +1 ![]() | ||
| FR, PVA>>>А как в ФЯ делается "закат солнца" автоматом? LCR>>Идеально подходит для hot upgrade динамически типизированный функциональный язык. В Practical Common Lisp есть пример, когда программу в космическом челноке исправили прямо во время полёта. FR>Динамический типизированный не функциональный язык (например clisp Ну вот, нашёл заусенчик и зацепился Программы, написанные в функциональном и динамически типизированном стиле идеально подходят для hot upgrade. То есть если мы будем писать на Яве, причём у нас все методы будут статические и все сигнатуры методов будут иметь вид
где
то такие программы тоже будут идеально подходить для hot upgrade. Какие ещё будут возражения? ... << RSDN@Home 1.1.4 stable SR1 rev. 568>> quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#) |
| Re[7]: Функциональное программирование для всех | |
| От: | PVA | ||
| Дата: | 18.10.06 08:47 |
| Lazy Cjow Rhrr, PVA>>А как в ФЯ делается "закат солнца" автоматом? LCR>Идеально подходит для hot upgrade динамически типизированный функциональный язык. В Practical Common Lisp есть пример, когда программу в космическом челноке исправили прямо во время полёта. Собственно, примеров можно придумать кучу. Меня больше интересовал технический подход к этому: как это делается в недрах с описанием на пальцах. У меня создается ощущение, что язык скриптовый/интерпретируемый. PVA>> LCR>Разница видна невооружённым глазом. PVA>> LCR>>>Если могут — делают, но почти всегда не могут. А не могут, потому что когда вы пишете foo(x, y), то аргументы x и y должны быть вычислены до того, как управление передастся в функцию foo. PVA>>Вобщем-то, это зависит от того, чего мы хотим добиться, не так ли? x и y могут быть ссылками на объекты и вычисляться только по необходимости. LCR>Хм. Это очень жёсткие грабли, если "вычисления по необходимости" будут давать побочные эффекты (вычисления А и Б используют общую память, А пишет в общую память, Б читает, и при ленивом исполнении Б может быть вычислено раньше). Кроме того, опасны неожиданно возникающие циклы (для вычисления А нужен вычесленный Б, а для вычисления Б нужен вычисленный А). Поэтому единственный гарантированный способ избежать таких граблей — энергичное выполнение. Хм2. Что-то здесь не совсем понятно как эти же вопросы решают ФЯ. PVA>> PVA>>>>Аналогично функциям высшего порядка. LCR>>>Возможно у вас есть свежая идея. Поделитесь? PVA>>Не думаю, что она свежая — я ее изложил в предыдущем абзаце. Если хотите выполнения только в точке использования — пусть аргумент будет ссылкой на объект. LCR>А подробнее? Давайте разберемся с предыдущим абзацем — может вопрос отпадет сам собой. PVA>>>>А реализовано может быть через те же функторы. LCR>>>Это вы делаете вывод исходя из ошибочного предположения, что функции высшего порядка == функторы. А на самом деле функторами можно эмулировать ФВП (так же как это делает компилятор написанный на C). PVA>>Если предположение ошибочно, то как функторами можно эмулировать ФВП? LCR>Напрямую: функторы выступают как реализация ФВП, они инкапсулируют АСТ, реализация позволяет во время создания оптимизировать это АСТ и порождать скажем шитый код (это как бы jit-компиляции). Тоесть, если нет требования к hot upgrade, то для разработчика эти понятия одинаковы? Если я правильно понял, то здесь разница как между скомпилированным кодом и скриптом. PVA>>(1 << 8) ... LCR> PVA>>А можно реальный аналог подобной задачи? Думаю в ИЯ можно найти решение для нее без функторов (а может и с ними). LCR>Любая задача, где требуется создать конструктор функций, причём возвращаемая функция будет зависеть от переданных аргументов. Интерпретатор выражений, реализация потоков (streams, которые), процессоры естественного языка, экспертные системы и т.п PVA>>А еще русскоязычные обзоры/введения/и т.д. есть на просторах? PVA>>Общая картина ясна, но насколько это перспективно и в каких задачах (помимо описанных в faq, приведенном в статье)? LCR>Мне очень нравится статья Сильные стороны ФП (в оригинале "Why functional programming matters") Джона Хьюгса. newbie |
| Re[7]: Функциональное программирование для всех | |
| От: | PVA | ||
| Дата: | 18.10.06 11:01 |
| Lazy Cjow Rhrr, Интересно, что LCR>
В свете только что просмотренного ролика про телефоны, хотелось бы заметить, что они производят фикс и перезапуск независимого модуля, который неактивен в данный момент. p.s. Пошел копать в недры newbie |
| Re[6]: Функциональное программирование для всех | |
| От: | Lazy Cjow Rhrr | ||
| Дата: | 19.10.06 11:23 |
| Кодт, LCR>>(ocaml) LCR>>Больше чем уверен, что вы вернёте разве что функтор-интерпретатор, который будет инкапсулировать АСТ. К>Во-первых: а что здесь вообще можно вернуть? Какой код порождает компилятор caml? К>- строит AST К>- приводит к форме, свободной от переменных, т.е. к коду для комбинаторной машины — опять же, в каком базисе? есть ли там Y-комбинатор? К>- выполняет преобразования, в ходе которых создаёт концевую рекурсию, а её, в свою очередь, переводит в итерации Можно (в принципе) вернуть указатель на бинарный блок, полученный при компиляции (на лету) данной функции. К>Во-вторых, если не следовать заданию до последней буквы, то именно итерационную версию и можно написать К>
Очень интересно. Но в данном случае ты взял заботу компилятора на себя и несмотря на то, что хорошо справился (
"Функция mk_index возвращает функцию, которая принимает имя и вызывает List.assoc с этим именем и предварительно сформированным списком ассоциаций." (Пример взят из книжки "Developing apps in ocaml", пункт "Reading a database from a file"). ... << RSDN@Home 1.1.4 stable SR1 rev. 568>> quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#) |
| 1 2 3 4 5 6 |