Как стать автором
Поиск
Написать публикацию
Обновить
16.7

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

От Lisp до Haskell

Сначала показывать
Порог рейтинга
Уровень сложности

Для чего на самом деле нужны стрелочные функции в JavaScript

Время на прочтение4 мин
Количество просмотров12K
Привет, Хабр! Представляю вашему вниманию перевод статьи «The real reason why JavaScript has arrow functions» автора Martin Novák.


* фраза-мем из игры Skyrim
Читать дальше →

Итоги двух лет изучения «Structure and Interpretation of Computer Programs»

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров18K


Я считаю, что разработка ПО в значительной степени заключается в программировании на псевдокоде. Если ты представил псевдокод, то перевести его на Python, C, что угодно — не проблема. Основная сложность заключается вот в этой концептуальной деятельности, а не в кодировании. Нужно знать, как подходить к тем или иным вопросам. Модульность, абстракция. Гибкость, надёжность, простота. Шаблоны проектирования. Юнит-тестирование. Ю ноу.

Есть на свете курс «Структура и Интерпретация Компьютерных Программ» (далее СИКП), который позиционируется как введение в Computer Science и ранее использовался в MIT для обучения первокурсников. Два года назад я с удовольствием одолел курс лекций по нему и взялся за книгу.
Читать дальше →

Впечатление от Стэнфордских курсов CS193P Весна 2020 г.: Разработка iOS приложений с помощью SwiftUI

Время на прочтение10 мин
Количество просмотров11K


Стэнфордский университет, США — один из лучших в мире в области информатики (Computer Science). Он щедро делится своими курсами, и одним из самых популярных и успешных курсов является курс CS193P по разработке приложений на iOS, который читает профессор Пол Хэгерти.
Предложенные в весеннем семестре 2020 года лекции Стэнфордского курса CS193P «Developing  Application for iOS with SwiftUI» («Разработка приложений для iOS с использованием SwiftUI») были прочитаны студентам Стэнфорда с ориентацией на новый продукт, предоставленный Apple разработчикам в 2019 г, — фреймворк SwiftUI для разработки реактивного пользовательского интерфейса (UI). На сайте курса вы найдете материалы, которые были предоставлены студентам Стэнфорда в течение весеннего семестра 2020 г.: ссылки на видео, слайды, домашние задания и код демонстрационных примеров. Русскоязычный конспект курса представлен здесь.

SwiftUI — это совершенно новая вещь, которой было всего несколько месяцев от роду на момент прочтения лекций. Но это самый передовой край технологий, которые, наконец, добрались до разработки приложений на iOS. В июне 2020 г. состоялась международная конференция разработчиков Apple WWDC и там была представлена следующая версия SwiftUI 2.0. Изменения в версии SwiftUI 2.0 отражены на сайте курса на закладке WWDC.
Читать дальше →

SRFI-216: Поддержка курса SICP. Обсудим?

Время на прочтение6 мин
Количество просмотров3.1K

TL;DR: Я написал и выложил на всеобщее обсуждение Scheme Request for Implementation 216. Он нацелен на то, чтобы одна из самых известных в мире учебных программ по Computer Science, Structure and Interpretation of Computer Programs, стала выполнимой в полном объёме не только на MIT/GNU Scheme, но и на других интерпретаторах и компиляторах, в частности, на вашем любимом. И если раньше запрос в багтрекер "сделайте, пожалуйста, поддержку SICP" звучал бы расплывчато, то после принятия данного SRFI, поддержка SICP должна стать намного более общепринятой.

Чтобы написать этот документ, я проработал SICP целиком (что потребовало более 700 рабочих часов и заслуживает отдельного поста), выделил части, до сих пор не вошедшие в стандарт, и сформулировал их в качестве двух документов, SRFI-203 (принят в сентябе 2020), и данного, SRFI-216, к которому я и приглашаю всех присоединиться.

За техническими деталями и подробностями,

прошу под кат.

Глубже в дебри ФП

Время на прочтение23 мин
Количество просмотров11K

Прежде чем начать, зацените эту красоту! Это — игра "жизнь" на языке APL:



В прошлой статье о функциональном программировании мы обсудили некоторые концепции ФП (впрочем, довольно вольно). В этой статье я бы хотел продолжить раскрывать суть других понятий, не затронутых в первой статье. Все же ФП не ограничивается одними монадами, хотя о них сегодня тоже поговорим.


Впереди вас ждут скандалы, интриги, расследования, моноиды, трансформеры, линзы и прочие полугруппы с комонадами. Заодно попытаемся разобраться, откуда происходят эти странные названия.


Расчехляйте свои абстрагаторы ...

Сравнение встраиваемых ЯП по размеру в исполняемом файле

Время на прочтение5 мин
Количество просмотров6.4K

В рамках одного из моих SDK-проектов нам понадобилось добавить скриптование, которое бы оказало наименьший эффект на размер конечного бинарного файла, но при этом предоставляло хорошую фунциональность. Это дало старт проекту, который описан в этой статье. Прошу заметить, что т.к. в SDK у нас есть определенные требования, они частично перенеслись на язык скриптования, поэтому в проекте не участвовали некоторые достаточно известные встраиваемые ЯП (но Lua включен для сравнения).


Сайт проекта доступен по ссылке. Скажу сразу, что на данный момент для меня лично победителями являются Chibi-Scheme и Wasm3. Подробности для заинтересовавшихся под катом.

Читать дальше →

Повесть о стрелке и запятой

Время на прочтение6 мин
Количество просмотров8.6K
В этой статье мы:

  • Познакомимся с сопряженными функторами
  • Узнаем, как отвечать на вопрос «что такое каррирование»
  • Притворимся, что у нас есть состояние (если есть только функции)
  • И вдогонку поиграемся с примитивной оптикой (линзами)

И все это с помощью нескольких определений теории категорий и двух простейших конструкций: стрелки и запятой.


Читать дальше →

Частичное применение и «каррирование» функций в Лиспе

Время на прочтение8 мин
Количество просмотров3.1K
Одно из известных преимуществ Лиспа над другими языками программирования состоит в том, что в Лиспе проще, чем где бы то ни было, реализуются различные новые механизмы, появляющиеся в современных языках программирования. Причин тому несколько: это и гомоиконность Лиспа (единая форма представления программ и данных) и уникальная по своим возможностям система макро. В общем, Лисп не зря называют «программируемым языком программирования».

В этой небольшой заметке мы рассмотрим, как можно реализовать в Лиспе такой, весьма популярный ныне программный механизм, как частичное применение функций. При этом я буду использовать свою реализацию Homelisp (это чистый интерпретатор Лиспа с некоторыми дополнительными возможностями).

Вероятно, использование частичного применения в Common Lisp будет не очень простым (в связи с тем, что для вызова вычисляемого функционального объекта нужно использовать funcall/apply); в Scheme дело должно обстоять проще. В ближайшее время я планирую опубликовать новую версию HomeLisp, в котором для вызова вычисляемого функционального объекта не требуется funcall/apply. В тех случаях, когда поведение кода отличается, я буду это подчёркивать.

Частичное применение — это строгая математическая операция. Но мы рассмотрим ее «на пальцах», без обращения к лямбда-исчислению и комбинаторной логике.
Читать дальше →

Сказка о парадигмах программирования

Время на прочтение8 мин
Количество просмотров6K

Привет, друг. Удачно заглянул на огонёк ты, ибо сказку собираюсь сказать я. Об эпохах нынешней и минувшей, о пределах могущества кодерского, и о том, как в силе себе отказывая, силы достичь можно. А коли не интересна тебе тема парадигм, дальше листай и вид сделай, что не слышал о сказке моей. Зайдёшь же коли на огонёк, так знай, что словца красного ради не всегда сказитель хронологию соблюдал и на совести его перегибы все и недомолвки.


Читать дальше →

Опубликован Scheme Request For Implementation — 203: A Simple Drawing Language in the Style of SICP

Время на прочтение3 мин
Количество просмотров1.6K

Structure and Interpretation of Computer Programs -- это один из самых известных учебников программирования в мире, на основе которого несколько десятков лет преподавался начальный курс программирования в MIT, а во многих унивеситетах, в том числе в Беркли, преподаётся до сих пор.

В статье анонсируется только что вышедшее расширение базового стандарта Scheme (r7rs), которое, по задумке автора расширения, должно поспособствовать большему распространению вышеупомянутого учебника среди заинтересованных читателей.

Расширение предлагает набор функций, применимых в качестве субстрата для реализации метода функциональной геометрии Питера Хендерсона таким образом, каким это предложено в SICP. Тем самым расширяется множество интерпретаторов Scheme, пригодных в качестве базовых при прохождении курса.

Читать далее

ICFP Contest 2020 от идеи до воплощения. Как организовать контест и выжить

Время на прочтение17 мин
Количество просмотров5.8K


В этом году мы стали первой командой из России, которая организовала международное соревнование по программированию ICFPC. В статье рассказываем, как перешли из участников в организаторы, какие грабли и вызовы встретили по пути и каким в итоге получился контест.

Читать дальше →

Пайплайны и частичное применения функций, зачем это в Python

Время на прочтение4 мин
Количество просмотров18K


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

Читать дальше →

Вычисляем определитель матрицы на Хаскелле

Время на прочтение5 мин
Количество просмотров5.9K
Решил выложить код вычисления определителей. Код рабочий, хотя и не претендует на виртуозность. Просто было интересно решить эту задачу именно на Хаскелле. Рассмотрены два подхода к решению задачи: простая рекурсия и метод Гаусса.

Немного теории


Как известно, определитель квадратной матрицы n*n — это сумма n! слагаемых, каждое из которых есть произведение, содержащее ровно по одному элементу матрицы из каждого столбца и ровно по одному из каждой строки. Знак очередного произведения:

${a}_{1,i1}*{a}_{2,i2}*...{a}_{n,in}$


определяется чётностью подстановки:

$\begin{pmatrix}1 & 2 & ... & n \\ {i}_{1} & {i}_{2} & ... & {i}_{n} \end{pmatrix}$


Читать дальше →

Ближайшие события

Функциональное программирование в Python. Генераторы, как питонячий декларативный стиль

Время на прочтение19 мин
Количество просмотров29K
  • Общее введение
  • ФП
    • Введение в ФП
    • Основные принципы ФП
    • Основные термины
    • Встроенное ФП поведение в Python
    • Библиотека Xoltar Toolkit
    • Библиотека returns
    • Литература
  • Генераторы
    • Введение в итераторы
    • Введение в генераторы
    • Генераторы vs итераторы
    • Генераторы как пайплайн
    • Концепт yield from
    • Маршрутизация данных на генераторах (мультиплексирование, броадкастинг)
    • Пример трейсинга генератора
    • Стандартные инструменты генераторы
    • Выводы
      • Плюсы
      • Минусы
    • Литература
  • Итоги

Общее введение

Читать дальше →

Изучаю Scala: Часть 4 — WebSocket

Время на прочтение5 мин
Количество просмотров4.9K

Привет, Хабр! На этот раз я по пробовал сделать простенький чат через ВебСокеты. За подробностями добро пожаловать под кат.
Читать дальше →

Почему разработчики влюбляются в функциональное программирование?

Время на прочтение8 мин
Количество просмотров35K
Функциональное программирование (ФП) существует уже лет 60, но до сих пор оно всегда имело достаточно узкую сферу использования. Хотя компании, меняющие мир, вроде Google, полагаются на его ключевые концепции, средний современный программист знает об этом феномене очень мало, если вообще что-то знает.

Но это скоро изменится. В такие языки, как Java и Python, интегрируется всё больше и больше концепций ФП. А более современные языки, вроде Haskell, являются полностью функциональными.



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

ФП, по своей природе, подходит для решения актуальных задач, вроде задач анализа данных и машинного обучения. Это не означает, что нужно попрощаться с объектно-ориентированным программированием и полностью перейти на функциональное. Современному программисту просто полезно знать основные принципы ФП, что даст ему возможность применить эти принципы там, где они могут сослужить ему хорошую службу.
Читать дальше →

Изучаю Scala: Часть 3 — Юнит Тесты

Время на прочтение4 мин
Количество просмотров4K


Привет, Хабр! Мало написать хороший код. Нужно еще покрыть его хорошими Юнит Тестами. В прошлой статье я сделал простой веб сервер. Теперь попробую написать насколько тестов. Обычных, Property-based и с моками. За подробностями добро пожаловать под кат.
Читать дальше →

Объектно-ориентированное программирование – катастрофа за триллион долларов. Часть 1

Время на прочтение3 мин
Количество просмотров11K

Пришло время уйти от OOP


OOP считается самым большим бриллиантом в короне компьютерной науки. Лучшим способом организации кода. Решением всех проблем. Единственно верным способом писать наши программы. Ниспосланным нам свыше самим богом программирования… Только вот OOP программист вынужден разгребать кучу всяких абстракций, следить за всеми совместно используемыми объектами, помнить тонны «паттернов программирования» — и на все это тратить свои время и силы вместо того, чтобы решать саму поставленную задачу.
Читать дальше →

Перевозим волка, козу и капусту через реку без эффектов на Elixir

Время на прочтение3 мин
Количество просмотров4K

Становится уже доброй традицией — все любопытное, что появилось на Хаскеле — повторять на Эликсире.


Первой ласточкой были «Примерно 20 строк для подсчета слов», появившиеся как алаверды на «Побеждая C двадцатью строками Haskell: пишем свой wc» от 0xd34df00d — сегодня же я наткнулся на «Перевозим волка, козу и капусту через реку с эффектами на Haskell» от iokasimov и тоже не устоял.


Итак, встречайте: ленивый полный асинхронный параллельный перебор против алгебраических эффектов.

Читать дальше →

Перевозим волка, козу и капусту через реку с эффектами на Haskell

Время на прочтение4 мин
Количество просмотров11K
Однажды крестьянину понадобилось перевезти через реку волка, козу и капусту. У крестьянина есть лодка, в которой может поместиться, кроме самого крестьянина, только один объект — или волк, или коза, или капуста. Если крестьянин оставит без присмотра волка с козой, то волк съест козу; если крестьянин оставит без присмотра козу с капустой, коза съест капусту.


В этой статье мы попытаемся найти обобщенное решение для такого типа головоломок и для этого будем использовать алгебраические эффекты.
Читать дальше →

Вклад авторов