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

А так же языках: Smalltalk, Prolog, Erlang, Haskell и, возможно Go, Rust и Scala.

Некоторое время назад я увидел на одном известном форуме тему «Почему не выстрелил Smalltalk». Заинтересовавшись (а я мельком изучал его когда искал «язык под себя» в вышеперечисленном списке, но бросил когда увидел, что идея посылки сообщений там фактически не используется), вступил в дискуссию апеллируя к тому что автор языка фактически не использует важнейшую, на мой взгляд, особенность языка – посылку сообщений. Собеседники парировали тем что там имеются такие важные особенности как метаклассы и рефлексия. В общем-то ответить на это было нечем, я бросил изучение языка еще до полного понимания системы классов.

Поразмышляв, я сел разбираться в системе классов Smalltalk’a. Поначалу мне показалось это невообразимым ужасом: экземпляр, объект, класс объекта, метакласс объекта, класс метаклассов. Подумав о могучей фантазии автора языка, я все же немного стал понимать, что к чему, а далее наткнулся на такой текст:
Читать полностью »

JavaScript в последние годы набрал нешуточную популярность, в связи с чем его подводные камни также стали явственно видны. Справедливости ради, стоит отметить, что любой язык в некоторой мере имеет как своё legacy, так и подводные камни.
Конкретно JavaScript обладает целым огородом камней. Подводным огородом.

На практике, подводные камни встречаются не так часто, напротив, хороший код склонен быть описанным в рамках здорового подмножества языка. Это также является и причиной, почему запомнить все заковырки языка достаточно сложно: они не являются необходимыми для каждодневной практики. Тем не менее, разнообразные граничные случаи использования языковых конструкций это отличная разминка для ума, а также стимул узнать язык немного лучше. Сегодняшний экземпляр попался мне на глаза в процессе прохождения JavaScript Puzzlers.

Меня заинтересовал вопрос номер 3:
Каков результат этого выражения (или нескольких)?

[ [3,2,1].reduce(Math.pow), [].reduce(Math.pow) ]

В качестве ответа авторами, на выбор, даются следующие варианты:
* ошибка
* [9, 0]
* [9, NaN]
* [9, undefined]

Попробуйте и вы, без запуска интерпретатора, пользуясь только своим умом ответить на этот вопрос.

Несмотря на то, что пример достаточно отстранённый, аппликация функций и частично определённых функций к коллекциям это распространённая практика для JS, и, при здравом использовании, она способна сделать код чище, как в плане исполнения — избавить его от лишних замыканий, так и в визуальном плане — меньше скобочного мусора (вопрос использования препроцессоров оставим для другой статьи).

А в этой статье вы найдёте:
* Разбор задачки.
* JavaScript reduce с чисто практической точки зрения.
* Несколько акробатических этюдов с reduce (reduce с академической точки зрения).
* Репозиторий с плюшками к статье.
* Несколько других reduce.
Читать полностью »

Жесть! Это как программирование через регулярные выражения…
Нет, вы меня не заставите! Больше никогда!

Смотрю на код и чувствую себя идиотом. Это правда не эзотерический язык типа brainfuck? Им кто-то реально пользуется? И эти программы потом читают?

quicksort=: (($:@(<#[), (=#[), $:@(>#[)) ({~ ?@#)) ^: (1<#)

Perl нервно курит в сторонке.

Хабрахабр о J

imageJ — корейский среди языков программирования. Взрыв на фабрике спецсимволов. Куча скобочек, точек, слэшей, и всё это ещё и работает. Не иначе как по велению чёрной магии, а то и самого Сатаны.

Некоторые из тех, кто пишет на J, забывают простые правила написания любого кода в погоне за краткостью или просто увлекшись. Эти правила не новые, но они приобретают критическое значение применительно к APL-подобным языкам, потому как при чтении конструкций вроде ((]i.~[:{.[){([:{:[),]`([:<[$:[:>])@.([:32&=[:3!:0[:>]))"2 0 даже тренированный мозг сворачивается в трубочку.

Итак, простые правила написания читаемого кода на J под катом.

Без словарика под кат лучше не соваться. Вас предупреждали.
И напомню, список полезных ссылок здесь.
Читать полностью »

Дорогие любители Scala! Пользуемся последним моментом, чтобы сообщить вам об очередной встрече Scala User Group в Москве. Она пройдет в эту пятницу, 25 апреля на территории НИИ «Восход». Начало в 19:30. Для того, чтобы прийти на встречу, необходимо заполнить форму регистрации: docs.google.com/forms/d/1tYo8unkWNpQYN-lCwoZz4mL7AcvNQGi_Zt1O7TTpknA/viewform (все поля обязательны, ФИО должны вводиться целиком). Последний день регистрации — сегодня, 23 апреля.
Читать полностью »

Квантовая схемотехника: некоторые приёмы и техникиСегодня в рамках работы над книгой «Квантовые вычисления и функциональное программирование» я хотел бы представить на суд почтеннейшей публики свою очередную статью про квантовые вычисления.

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

  1. Прямой анализ. При наличии схемы входа и описания вычислительного процесса определить схему выхода.
  2. Обратный анализ. При наличии описания вычислительного процесса и схемы выхода определить схему входа.
  3. Синтез. При наличии схем входа и выхода построить описание вычислительного процесса.

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

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

Большинство приложений тратят много времени на ожидание событий и их обработку. Они ожидают взаимодействия пользователя с интерфейсом. Ожидают ответа на сетевой запрос. Ожидают завершения асинхронных операций. Ждут изменения зависимого значения. И только потом они реагируют.

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

Именно поэтому мы решили сделать общедоступной часть волшебства, стоящей за GitHub for Mac: ReactiveCocoa (RAC). RAC — это framework для компановки и преобразования последовательностей значений.
Читать полностью »

Приветствую всех Хабражителей!

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

Озвучу причины, с чего это вдруг мне, самому заурядному C++-разработчику, взбрело в голову написать про Haskell.
Читать полностью »

ZoG на стероидахКогда я писал о разработке игры "Thud!", я уже сетовал на некоторую избыточность полученного описания. Простота языка ZRF имеет свою оборотную сторону — для того чтобы написать на нем что-то более менее сложное, часто, приходится дублировать значительные фрагменты кода. Подобная избыточность, как известно, приводит не только к увеличению объема ручной работы, но и значительно усиливает риск появления в коде разнообразных ошибок (поскольку процесс отладки ZoG приложений весьма не тривиален, это является существенным моментом).

Как можно бороться с подобной избыточностью?

Разумеется, с помощью макросов! Проблема в том, что макросы ZRF недостаточно выразительны для этого. Адриан Кинг, в процессе разработки игр Scirocco и Typhoon, пришел к аналогичному выводу и разработал свой собственный, расширенный язык макросов, работающий как внешний препроцессор. Сегодня, я расскажу о возможностях этого языка и постараюсь, на примере Thud!, показать его использование в процессе разработки ZRF-приложений.

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

В прошлый раз мы провели ознакомительную встречу. Собралось около 25 человек, мы узнали кто в Москве занимается разработкой на Scala и какие есть интересные проекты. Главной темой выбрали курс по реактивному программированию на Coursera, который как раз тогда подходил к концу.

В этот раз мы соберёмся послушать и обсудить два доклада:

  1. Алексей Иванов приедет из Питера и расскажет доклад «Monadic Bakery with Spray and Scalaz»,
    про то почему Spray и ScalaZ — не страшные звери, а хорошие друзья;
  2. Владимир Успенский расскажет про теорию типов и тем, как она связана с обычной разработкой в докладе:
    «Теория типов, или как мы занимаемся математикой, программируя на Scala».

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

Scala Moscow User Group, встреча 14 марта 2014

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

Очень часто в статьях про Хаскель сплошь и рядом встречаются функторы и особенно монады.
Так часто, что порой не реже встречаются комментарии «сколько можно про какие-то новые монады» и «пишите о чём-либо полезном».
На мой взгляд это свидетельствует о том, что люди порой не понимают зачем же нужны все эти функторы и монады.

Это статья попытка показать, что сила функциональных языков и в первую очередь Хаскеля — это в том числе и силе функторов и монад.
Зачем нужны все эти фунткоры и монады?
Читать полностью »


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