Рубрика «функциональное программирование» - 36

Известно, что дерево – довольно сложная структура. И если чтение успешно реализуется рекурсией (которая не лишена своих проблем), то с изменением дела обстоят совсем не хорошо.

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

Классическое концептуальное объяснение зиппера, выглядит как-то так: это взгляд изнутри на древовидную структуру как бы вывернутую наизнанку, вроде вывернутой перчатки.

Это образное объяснение, если поскрипеть мозгами, обычно, конечно же, понимается только в какой-то мере, далее зипперы откладываются в сторону, потому что «это непонятная какая-то функциональная заморочка, типа монад, потом разберусь».

У автора «потом» уже наступило. Эта статья – попытка дать альтернативное объяснение зипперов (не путать с объяснением для альтернативно одаренных, хотя…) такое, что позволит быстро понять и немедленно начать использовать зипперы в практических задачах.
Читать полностью »

Привет!

В четверг, 17 марта (да-да, это послезавтра!), в 19:00 в офисе компании КРОК пройдет встреча JUG.msk c разработчиками языка Kotlin Андреем Бреславом и Дмитрием Жемеровым. Андрей — вообще самый главный человек в Kotlin, возглавляет разработку языка, а Дмитрий — возглавляет разработку плагина к IntelliJ IDEA. Так что будет что обсудить, и ответы на вопросы будут из первых уст!

Тема встречи — недавний и долгожданный релиз языка Kotlin. И поэтому встреча тоже называется очень просто:

image

Читать полностью »

fsharpConf 2016 — прямая трансляция виртуальной конференции по F# - 1

Всем привет! Сегодня, 4 марта, состоится виртуальная конференция fsharpConf 2016, посвящённая языку функционального программирования F# и связанным технологиям и инструментам.

Начало трансляции — в 19:30 (по Москве).

Не упустите возможность услышать о языке F# от его создателя, Дона Сайма, послушать о применении F# в production в компании jet.com, а также узнать много нового о персонажах звёздных войн на основе анализа данных в докладе Эвелины Габасовой (20:00). И конечно один из самых интересных и ожидаемых докладов — демонстрации Шона и Фила Трелфолдов в 21:30.

Читать полностью »

Шаблон проектирования View в языках с зависимыми типами - 1

Шаблоны проектирования! Впервые я узнал о них на курсе Software Design, когда учился в магистратуре Академического университета. Мы писали различные программы на Java с использованием шаблонов. С тех пор это словосочетание ассоциируется у меня с чем-то таким ООПшным. Однако, разбираясь с языком Agda, я наткнулся на статью The Power Of Pi, которая рассказывает про шаблоны проектирования в языках с зависимыми типами!

В этом посте я хочу рассказать об одном из этих шаблонов, который называется View. С его помощью можно реализовывать пользовательские правила pattern matching'a. Если вам интересно, что это за шаблон, что такое пользовательский pattern matching, каковы особенности pattern matching'а в языках с зависимыми типами, и вы знакомы с каким-нибудь функциональным языком программирования со статической типизацией (Haskell, Scala, Ocaml, F#) — добро пожаловать под кат!Читать полностью »

image

Что будет: доклады, пицца, общение, отличный вечер четверга.

Список заявленных докладчиков и тем под катом.
Читать полностью »

Почему я больше не использую MVC-фреймворки - 1

Опубликовано с большого одобрения автора и согласия портала infoq.com. Надеюсь, мои языковые навыки оправдают оказанное автором доверие.

Худшее в моей работе на сегодняшний день, это проектирование API для front-end разработчиков. Диалог с ними неизбежно разворачивается следующим образом:

Dev — итак, на этом экране нужны данные x, y и z. Не мог бы ты сделать API, которое вернет данные в формате {x:, y:, z: }

Я — ok

Я больше даже не спорю с ними. Проекты заканчивается ворохом различных API, привязанных к экранам, которые меняются очень часто, что “by design” требует изменений в API. Вы и глазом моргнуть не успеваете, а у вас уже куча API и для каждого необходимо поддерживать множество форматов и платформ. Сэм Ньюман даже начал формализовывать этот подход как BFF Pattern, предполагающий, что это нормально — разрабатывать отдельное API для каждого типа устройства, платформы и, естественно, каждой версии вашего приложения. Дэниэл Якобсон рассказывал, что Netflix был вынужден начать использовать новую характеристику для своего “Experience API”: эфемерность. Ох…
Читать полностью »

Наверняка вы уже видели некоторые посты о D. Шаблоны, псевдочлены, потоки… Сегодня я вам расскажу о такой фиче языка, как UFCS, или Universal Function Call Syntax. Начнем с простого.

Рассмотрим некий класс A и функцию, принимающую указатель на его экземпляр:

class A {
	int a;
}

void foo(A a) {}

Спросите любого программиста на Си, как бы он её вызвал. Наверняка вы услышите что-то подобное:

void main() {
	auto b = new A;

	foo(b);
}

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

b.foo();

Это открывает большой простор для построения очень интересных, последовательных(и даже быстрых) конструкций.

Осторожно: в конце цветное изображение!
Читать полностью »

Дорогие хабрастуденты!

Мы хотим поздравить вас с профессиональным праздником — днём студента. Пускай учеба приносит вам счастье! По случаю праздника мы начинаем «студенческую неделю», в которой представим вашему вниманию несколько тематических постов для студентов. Их можно будет найти в нашем блоге на хабре или в нашем студенческом блоге.

Поздравляем студентов с профессиональным праздником - 1

Когда я был студентом, то Татьянин день был для меня почти таким же приятным праздником, как Новый год. Ведь в это время для многих заканчивается сессия, можно немного отдохнуть на каникулах и с новыми силами браться за новый семестр. А каникулы — это такое прекрасное время для самообразования!

В этот день мне хотелось бы поделиться с вами одной важной мыслью. Мне часто пишут и спрашивают: как лучше научиться программировать, какие языки программирования нужно изучать? И я почти всегда даю один и тот же ответ: бесполезно просто изучать языки по различным урокам, лучше поставить себе какую-то интересную задачу и начать её делать, а со всем остальным — включая языки, которые нужны для её реализации — разбираться по ходу дела. Также как и иностранный язык невозможно хорошо выучить только по книжке, без разговорной практики — так и язык программирования лучше всего изучать «в процессе».

При этом очень важно, чтобы задача была интересной. Ниже я немного подробнее расскажу про то, как можно сделать интересным процесс обучения в области IT (конечно же, с помощью технологий Майкрософт!), а также про небольшой подарок.
Читать полностью »

Я разрабатываю бесплатную библиотеку StreamEx, которая расширяет стандартное Java 8 Stream API, добавляя туда новые операции, коллекторы и источники стримов. Обычно я не добавляю всё подряд, а всесторонне рассматриваю каждую потенциальную фичу. Например, при добавлении новой промежуточной (intermediate) операции встают такие вопросы:

  1. Будет ли она действительно промежуточной, то есть не будет трогать источник до выполнения терминальной операции?
  2. Будет ли она ленивой и вытаскивать из источника не больше данных, чем требуется?
  3. Сработает ли она на бесконечном стриме? Требует ли она ограниченный объём памяти?
  4. Будет ли она хорошо параллелиться?

Минусик по любому из этих пунктов заставляет серьёзно задуматься, добавлять ли такую операцию. Минусик по первому — это сразу нет. Например, у конкурентов в jOOλ есть операция shuffle(), которая выглядит как промежуточная, но на самом деле прямо сразу потребляет весь стрим в список, перемешивает его и создаёт новый стрим. Я такое не уважаю.

Минусики по остальными пунктам не означают сразу нет, потому что есть и стандартные операции, которые их нарушают. Второй пункт нарушает flatMap(), третий — sorted(), четвёртый — всякие limit() и takeWhile() (в JDK-9). Но всё-таки я стараюсь этого избегать. Однако на днях я открыл для себя операцию, которая плохо параллелится и в зависимости от использования может не сработать на бесконечном стриме, но всё же слишком хороша. Через неё удаётся буквально в несколько строчек выразить как практически любую существующую промежуточную операцию, так и кучу несуществующих. Я назвал операцию headTail().
Читать полностью »

Конференцию посетило более 200 человек, среди которых были как поклонники технологий Google так и те кто только присматривается к ним. Мы получили множество положительных отзывов от посетителей DevFest’а и уже настроились проводить следующее событие, но об этом позже, а сейчас детали того, что было.

GDG DevFest Красноярск 2015: Фотоотчёт - 1
Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js