Как стать автором
Обновить
  • по релевантности
  • по времени
  • по рейтингу

Y-комбинатор, упрощение интерфейса

Чулан
Итак, все мы помним, что такое Y-комбинатор (кто не помнит, это комбинатор неподвижной точки или Y g = g Y g). Из математической его записи следует некоторая проблема: он генерирует последовательность g g g… g Y g, в которой каждый следующий шаг может использовать лишь результат предыдущего вычисления да захваченный из комбинатора кусок контекста — что приводит к необходимости для каждой функции писать свой собственный комбинатор.

Идея заключается в том, чтобы написать Y-комбинатор, который не будет зависеть от самоприменяемой функции.

Читать дальше →
Всего голосов 6: ↑3 и ↓3 0
Просмотры332
Комментарии 5

F# не ленится :(

Чулан
Вот код:

let rec Y func tracker args =
    func args (Y func tracker (tracker args))
    
let fib N = (fun (x, y) -> x) (Y 
    (fun N (prev, pprev) -> if N = 1 then (1, 0) else (prev + pprev, prev)) 
    (fun N -> N - 1)
    N)
        
let main =
    let value = fib 10
    System.Console.WriteLine(value)
    System.Console.ReadKey()

При компиляции и запуске он, вместо того, чтобы полностью рассчитать первую лямбда-функцию с N = 0 на кой-то черт рассчитывает никому не нужные значения N, меньшие нуля!

Что происходит? Может быть, «ленивость» можно как-то форсировать?
Всего голосов 13: ↑7 и ↓6 +1
Просмотры199
Комментарии 7

Objective CAML

Чулан
Objective CAML — один из гибридных языков программирования, то есть поддерживающий несколько парадигм программирования, в данном случае у нас это объектно-ориентированное программирование и функциональное программирование. Как известно, сильными сторонами функционального программирования являются: надежность кода, удобство тестирования, возможность оптимизации при компиляции и т.д. Но несмотря на все достоинства функционального программирования, так же присутствуют и минусы, такие как: отличающийся стиль написания программ от императивного, зачастую нехватка хорошей литературы, неудобный синтаксис и т.д.
Если кого — либо заинтересует, рискну рассказать по подробнее об этом языке программирования.
Всего голосов 5: ↑4 и ↓1 +3
Просмотры764
Комментарии 6

Ocaml. Типы данных

Чулан

Введение


В этом посте перейдем непосредственно к ознакомлению с языком Objective Caml. В этом посте будет рассказано об базовых типах данных Objective Caml.
Для начала вам необходимо скачать и установить Objective Caml, на этом этапе достаточно будет одного интерпретатора. Запуск интерпретатора производится с помощью: команды ocaml, если дело происходит в *nix, либо запуска ocaml.exe если дело происходит в Windows.
После запуска интерпретатора мы увидим следующее: версию Ocaml, у меня это Objective Caml version 3.00, и ожидание ввода команд:#.
Каждая логическая единица кода — фраза, заканчивается в Objective Caml — ;; Выход из интерпретатора, осуществляется либо по нажатию Сtrl+D, либо после вызова функции exit типа int -> int:
exit 0;;
Продолжение
Всего голосов 10: ↑7 и ↓3 +4
Просмотры718
Комментарии 11

Жемчужины функционального программирования: рисуем деревья

Программирование
В этой статье я собираюсь поведать читателям о рисовании деревьев. Нет, не тех деревьев, которые растут из почвы и в которых селятся белки. Сегодня мы будем визуализировать деревья как структуры данных. Данная статья написана по мотивам статьи Andrew Kennedy «Functional Pearls: Drawing Trees» из журнала Journal of Functional Programming, 6(3): 527-534, Cambridge University Press, May 1996 (электронная версия статьи тут), и является, в некотором роде, её переводом.
Читать дальше →
Всего голосов 26: ↑26 и ↓0 +26
Просмотры3.9K
Комментарии 3

Замыкания и объекты JavaScript. Переизобретаем интерпретатор

JavaScriptКомпиляторыООП
Tutorial
Обычно концепции или парадигмы программирования объясняют либо описательно — «разжёвывая» новые идеи простыми словами, либо метафорически — уподобляя их хорошо знакомым аудитории предметам и понятиям. Но ни первый, ни второй способ не дает такого точного и полного представления о предмете, как взгляд с точки зрения низкоуровневой реализации.

Когда в изучении языка доходишь до нетривиальных вещей, бывает полезно сместить уровень абстракции, чтобы понять, как на самом деле всё устроено. Ведь, по большому счету, любые конструкции языков сколь угодно высокого уровня сводятся к старому доброму машинному коду. Писать в объектно-ориентированном или функциональном стиле можно и на чистом C, и даже на ассемблере. Грубо говоря, любой высокоуровневый язык — это зафиксированный на уровне компилятора или интерпретатора набор синтаксических карамелек и шоколадок. Повышение уровня абстракции позволяет писать более сложные программы с меньшими усилиями, но вот понять в начале пути, что конкретно имеется в виду под наследованием или замыканием, как это всё работает и почему, гораздо легче, разобравшись, каким образом всё это реализовано.

JavaScript, как никакой другой язык, нуждается в именно таком объяснении. Функциональная природа, скрытая за Си-подобным синтаксисом, и непривычная прототипная модель наследования поначалу сильно сбивают с толку. Давайте мысленно понизим уровень JavaScript до простого процедурного, наподобие Си. Отталкиваясь от этого «недоязыка», переизобретем функциональное и объектно-ориентированное программирование.
Читать дальше →
Всего голосов 114: ↑113 и ↓1 +112
Просмотры23.9K
Комментарии 30

Что не так с ООП и ФП

Проектирование и рефакторингООПФункциональное программирование
Перевод
Я не понимаю причины существования бесконечных споров вокруг Объектно-ориентированного (ООП) и Функционального (ФП) программирования. Кажется, что такого рода вещи находятся за пределами человеческого понимая, и о них можно спорить бесконечно. Много лет занимаясь исследованием языков программирования, я увидел четкий ответ, и зачастую я нахожу бессмысленным обсуждение этих вопросов.

Если кратко, то как ООП, так и ФП неэффективны, если доходить в их использовании до крайности. Крайностью в ООП считается идея о том что “все что угодно является объектом” (чистое ОП). Крайностью для ФП можно рассматривать чистые функциональные языки программирования.
Читать дальше →
Всего голосов 148: ↑116 и ↓32 +84
Просмотры68.7K
Комментарии 166

Что так с ООП и ФП, и что не так с программированием

Проектирование и рефакторингООПФункциональное программирование
Так уж завелось на хабре, что на каждую холиварную статью «Pro» всегда найдётся статья «Contra».
Я тоже решил не оставлять в одиночестве пост «Что не так с ООП и ФП».



Прямо противоречить написанному смысла не имеет, там ведь описан «вкус», а, как известно, на вкус и цвет… каждый любит свой ЯП.
Нет никакой проблемы с ООП и ФП. Чистота функций — это всего лишь инструмент, равно как и «всё является объектом».
Критика права лишь в одном — в борьбе за миллиметры хорошо видны яркие прорехи, а в любых вырожденных методах недостатки ярко проявляются.
Другое дело, что любые невырожденные методы так же имеют недостатки, только их больше, зато они не так легко заметны.
Любители С++ гнобят полное ООП, Javа гнобит Си++ за неполное ООП, Haskell гнобит другие ФП за грязные функции, остальные ФП гнобят Haskell за излишне чистые функции.
Всё имеет свою оборотную сторону медали.
Тогда почему досталось всё объектам и функциям, а не массивам и указателям?!
Читать дальше →
Всего голосов 75: ↑47 и ↓28 +19
Просмотры25.4K
Комментарии 35

Статически типизированные продолжения

Ненормальное программированиеC++
Намедни на RSDN был задан такой вопрос:
Пусть у нас есть функция, возвращающая полиморфный тип
class Base { virtual int foo() const = 0; };
class A : public Base { int foo() const { return 1; } };
class B : public Base { int foo() const { return 2; } };
class C : public Base { int foo() const { return 3; } };
class D : public Base { int foo() const { return 4; } };

Base* getconfig(char cfg) // не будем пока отвлекаться на уборку мусора
{
  switch(cfg)
  {
  case 'a': return new A();
  case 'b': return new B();
  case 'c': return new C();
  case 'd': return new D();
  default: throw std::invalid_argument("bad type");
  }
}

и функция, принимающая его экземпляры
int entry(Base* x, Base* y) { return x->foo()*10 + y->foo(); }

которую используют примерно так
void run(char cx, char cy) { std::cout << cx << cy << " : " << entry(getconfig(cx), getconfig(cy)) << std::endl; }


Можно ли протащить полиморфизм на стадию компиляции?
Читать дальше →
Всего голосов 21: ↑19 и ↓2 +17
Просмотры10.4K
Комментарии 10

Когда использовать ООП, а когда — ФП?

ПрограммированиеООПФункциональное программирование
Перевод
Грубо говоря, у ФП и ООП схожие возможности в выражении сложных конструкций и инкапсуляции программ на мелкие куски, которые можно комбинировать между собой.

Самая большая разница между двумя этими «философиями» состоит в том, как данные соотносятся с операциями над данными.

Основной доктриной ООП является то, что данные и операции над ними сильно связаны: объект содержит данные и реализацию операций над данными. Он скрывает всё это от других объектов через интерфейс – набор методов или сообщений, на которые он реагирует. Таким образом, центральной моделью абстракции являются сами данные, спрятанные за небольшим API в виде интерфейса.

При ООП подходе программист составляет новые объекты и расширяет существующие путём добавления к ним методов.

Основной доктриной ФП является то, что данные слабо связаны с функциями. Над одним и тем же набором данных можно совершать разные действия, а центральной моделью абстракции является функция, а не структура данных. Функции прячут их реализацию, а абстракции языка общаются с функциями.

При ФП подходе программист пишет новые функции.
Читать дальше →
Всего голосов 39: ↑18 и ↓21 -3
Просмотры29.9K
Комментарии 25

Мины в Haskell и Gloss: быстрое прототипирование интерактивной графики

Haskell
Из песочницы
Tutorial
На Хабрахабре есть уже немало хороших статей по хаскелю, но по большей части это всяческие введения в ФП, разъяснения каких-то теоретических штук (вроде монад, лямбда-исчисления или семейств типов) и совсем немного практических примеров. Ни в коем случае не умаляя их полезности, попробую всё-таки сместить дисбаланс, внести свою лепту в неблагодарное дело популяризации функциональщины и ещё раз показать, что язык пригоден не только для написания факториалов и неэффективных быстрых сортировок в две строчки, но и для вполне практичных вещей вроде быстрого прототипирования.

Статья постарается быть относительно real-world, но при этом не утомлять читателя объёмом или экзотическими предметными областями. «Графика и игры в обучении — это всегда sexy», как завещал великий В. С. Луговский, поэтому я набросаю простую игру, всенародно любимый «Сапёр». Разработка будет вестись «сверху вниз» — это удручающе малораспространённая, но заслуживающая пристального внимания (как и сам хаскель) методология, которая когда-то давно встретилась в отличной статье о шашках в «Практике функционального программирования», и с тех пор запала в душу.
Читать дальше →
Всего голосов 27: ↑26 и ↓1 +25
Просмотры10.8K
Комментарии 4

Разговор со спикерами FPConf

RubyRussiaScalaФункциональное программирование
Привет!

Конференция FPConf уже в эту субботу, нас аж 160 и еще не поздно заскочить в последний вагон. Регистрация — тут.

А накануне мы решили задать нашим спикерам один довольно неоднозначный вопрос. Публикуем ответы, ваши варианты в комментах люто приветствуются!

image

В объектно-ориентированных языках есть широко известный список паттернов проектирования (design patterns) от «Банды четырех» (Gang of Four). В функциональных языках такого известного списка не существует. С вашей точки зрения, почему так?
Подобные паттерны не нужны при программировании на функциональных языках или просто их канонический список еще не сложился?


Читать дальше →
Всего голосов 19: ↑19 и ↓0 +19
Просмотры4.7K
Комментарии 10

Разговор со спикерами FPConf (часть 2)

RubyRussiaПроектирование и рефакторингФункциональное программирование
Привет!

Конференция FPConf уже завтра, сегодня последний шанс купить билет и присоединиться! Регистрация — тут.

Накануне мы решили задать нашим спикерам один довольно неоднозначный вопрос. Большая часть ответов была опубликована вчера — тут

А сегодня мы получили ответ от нашего гостя Эдварда Кметта. Пока публикуем без перевода, обновим пост после конференции.

image

Вопрос был такой:

В объектно-ориентированных языках есть широко известный список паттернов проектирования (design patterns) от «Банды четырех» (Gang of Four). В функциональных языках такого известного списка не существует. С вашей точки зрения, почему так?
Подобные паттерны не нужны при программировании на функциональных языках или просто их канонический список еще не сложился?


Читать дальше →
Всего голосов 6: ↑5 и ↓1 +4
Просмотры2.2K
Комментарии 16

PyNSK #5 — пятая встреча Новосибирского Python сообщества

Разработка веб-сайтовPythonПрограммированиеФункциональное программирование
image


Питонисты Новосибирска, приглашаем вас на встречу сообщества Python сообщества — PyNSK.

12-го декабря (суббота) состоится пятая встреча. Она пройдет в новом для нас месте — Культурный Центр «Этаж» и начнется 13-00.
На встрече вас ждет море общения и 2 доклада:
Узнать о докладах
Всего голосов 7: ↑7 и ↓0 +7
Просмотры2.9K
Комментарии 0

Жаргон функционального программирования

ПрограммированиеФункциональное программирование
Перевод


У функционального программирования много преимуществ, и его популярность постоянно растет. Но, как и у любой парадигмы программирования, у ФП есть свой жаргон. Мы решили сделать небольшой словарь для всех, кто знакомится с ФП.


В примерах используется JavaScript ES2015). (Почему JavaScript?)


Работа над материалом продолжается; присылайте свои пулл-реквесты в оригинальный репозиторий на английском языке.


В документе используются термины из спецификации Fantasy Land spec по мере необходимости.


Arity (арность)


Количество аргументов функции. От слов унарный, бинарный, тернарный (unary, binary, ternary) и так далее. Это необычное слово, потому что состоит из двух суффиксов: "-ary" и "-ity.". Сложение, к примеру, принимает два аргумента, поэтому это бинарная функция, или функция, у которой арность равна двум. Иногда используют термин "диадный" (dyadic), если предпочитают греческие корни вместо латинских. Функция, которая принимает произвольное количество аргументов называется, соответственно, вариативной (variadic). Но бинарная функция может принимать два и только два аргумента, без учета каррирования или частичного применения.

Читать дальше →
Всего голосов 91: ↑87 и ↓4 +83
Просмотры73.9K
Комментарии 113

Змея и кокос

PythonФункциональное программирование
Из песочницы

Я люблю Python. Нет, правда, это отличный язык, подходящий для широкого круга задач: тут вам и работа с операционной системой, и веб-фреймворки на любой вкус, и библиотеки для научных вычислений и анализа данных. Но, помимо Python, мне нравится функциональное программирование. И питон в этом плане неплох: есть замыкания, анонимные функции и вообще, функции здесь — объекты первого класса. Казалось бы, чего ещё можно желать? И тут я случайно наткнулся на Coconut — функциональный язык, компилируемый в Python. Всех любителей Python и ФП прошу под кат.

Читать дальше →
Всего голосов 26: ↑21 и ↓5 +16
Просмотры9K
Комментарии 18

Каррирование и частичное применение на C++14

Ненормальное программированиеПрограммированиеC++Функциональное программирование

В этой статье я расскажу об одном из вариантов каррирования и частичного применения функций в любимом мною C++, покажу свою экспериментальную реализацию сего действа и объясню без математики, на пальцах, что такое вообще каррирование и что же под капотом у kari.hpp, с помощью которой мы и будем каррировать функции. Ну и как тут принято: заинтересовавшихся — прошу под кат.

Читать дальше →
Всего голосов 23: ↑22 и ↓1 +21
Просмотры11.9K
Комментарии 18

Краткий справочник информатики

ПрограммированиеСовершенный кодПроектирование и рефакторингHaskellООП

Область ИТ растёт, и легко заблудиться в зоопарке подходов, фреймворков и технологий, которые громко заявляют о своей "новизне" и "эффективности". Но за обёрткой обычно скрываются старые добрые идеи, заново "изобретённые" в другом контексте. В итоге распространяется не самая простая и эффективная, а самая разрекламированная реализация. Разработчики не успевают вдумчиво произвести выбор из-за постоянного недостатка времени, а менеджеры выбирают самое распространённое, чтобы снизить риски при поиске разработчиков.


Для себя я стараюсь свести используемый в индустрии термин или технологию к простому определению или наглядному примеру. Предлагаю справочник, очень краткий, и поэтому неполный и не претендующий на точность.

Читать дальше →
Всего голосов 19: ↑8 и ↓11 -3
Просмотры4.6K
Комментарии 64
1