Size: a a a

Монада Кедавра

2017 September 13
Монада Кедавра
Привет, это тот чувак который постоянно меняет ники и javascript bleeding edge
источник
Монада Кедавра
Смог тезисно сформулировать отличие фьючерсов(futures) от стримов(streams) в js.

- Фьючерсы: декларативно данные, императивно результаты
- Стримы: императивно данные, декларативно - результаты

Чаще требуется первое, чем второе
источник
Монада Кедавра
Стримы с точки зрения кода, принимающего результаты — это сайд-эффект, на случай срабатывания которого можно только отреагировать, но не повлиять

Это "белая дыра" границ которой ничто не может достигнуть, с фактом выполнения которой можно только считаться
источник
Монада Кедавра
Фьючерсы же — «шаблон» для выполнения кода, принимает какие-то данные от нас и является неактивным объектом, то есть не будет вызван пока мы сами не потребуем этого
источник
Монада Кедавра
Типизацию в жс лучше начать изучать с тайпскрипта. Спокойно обрести необходимые навыки; привыкнуть к сборке типизированного кода, приноровиться к обработке ошибок в типах, смириться с излишними аннотациями, огрести от компромиссных решений и благополучно присоединиться к лагерю flow.

Всё познаётся в сравнении
источник
2017 September 18
Монада Кедавра
Однажды я столкнулся с мистической проблемой — серия последовательных операций спонтанно начинала выполняться в случайном порядке, вызывая race condition и абсурдные сообщения об ошибках. Первая операция однозначно запускалась  раньше второй, но сервер почему-то периодически сообщал об обратном в своей излюбленной манере: молча закрывал соединение. Раз за разом я вчитывался в одни и те же строчки, всё больше впадая в отчаяние; в коде не было ни намёка на источник хаоса. В течении двух недель в отладчике я перебрал все возможные варианты решения и приступил к невозможным, пока наконец не решил проблему, стерев один console.log.

Так я познакомился с сайд-эффектами.

Сайд-эффекты в коде — это места, в которых чистый абстрактный код сталкивается с реальным миром; понятие, которому уделено особое внимание в функциональном программировании. Когда функция пишет в файл или запускает ядерные боеголовки — это сайд-эффект. В моём случае вывод в консоль тормозил выполнение функции на период от 20 до 200 мс, а часть кода была рассчитана на то, что результаты будут доступны в течении текущего тика эвент лупа, и в сочетании с многопоточным libuv (io ядром nodejs) превращалась в бомбу замедленного действия.

Большинство ООП языков абсолютно беззащитны перед сайд-эффектами. И действительно, функция будет иметь один и тот же тип вне зависимости от того, есть ли там console.log или нет. Программисты вынуждены раз за разом сочинять самые разнообразные абстракции для одного и того же явления — функции, влияющей на окружающий мир. В фп же сайд эффекты явно выделяются в типе функции, тем самым явно определяя код, требующий аккуратного обращения.


Вот как это происходит в purescript:

Допустим, что у нас есть какой-то js код с сайд-эффектами, который мы хотим вызывать из нормального ™ языка
// Main.js
exports.pushTheButton = function() { console.log('nuclear missile launched') }

Чтобы различать разные сайд-эффекты, каждый из них можно задать как отдельный тип. Присутствует тип в сигнатуре функции — значит эта функция повлечёт за собой данный побочный эффект
module Main where

import Control.Monad.Eff(Eff, kind Effect)
import Control.Monad.Eff.Console (logShow, CONSOLE)
import Prelude (Unit, discard)

foreign import data NUCLEAR_MISSILE :: Effect

foreign import pushTheButton :: forall e. Eff (
 launch :: NUCLEAR_MISSILE | e
) Unit

main :: Eff (
 console :: CONSOLE,
 launch :: NUCLEAR_MISSILE
) Unit
main = do
 pushTheButton
 logShow "its fine"

-- Results:
-- nuclear missile launched
-- its fine

В результате имеем чётко описанные типы и предсказуемый чистый код



ООП перечисляет использованные предметы, ФП — описывает суть происходящего.
источник
2017 November 25
Монада Кедавра
Два пейпера для основательного погружения в структуры данных

Linked List Problems — обзор способов имплементации связных списков, вторая половина документа целиком посвящена практикам разрешения проблем при использовании

Efficient Immutable Collections посвящён подробному исследованию иммутабельных структур данных, и всевозможным аспектам их создания и функционирования. В полторы сотни страниц уместились как размышления об архитектурных подходах, так и практические методики превосходящие по скорости аналоги из Clojure и Scala
источник
Монада Кедавра
Linked List Problems
источник
Монада Кедавра
Efficient Immutable Collections
источник
Монада Кедавра
Ещё Efficient Immutable Collections в каждой главе содержит список Related Work по теме, можно залипнуть надолго
источник
2018 February 19
Монада Кедавра
Инсайт: приватные свойста — не то, чем кажутся.

В последнее время я много работаю с эвент-эммитерами и потоковой обработкой данных и регулярно сталкиваюсь с ситуацией, когда требуется хранить огромное, едва исчислимое количество данных в объекте (подписки, например), уповая лишь на работу GC, который должен убрать все данные, потерявшие актуальность. Как следствие, всё, что попадает в область видимости данного объекта становится ̶к̶в̶а̶н̶т̶о̶в̶о̶ связанным с данными, ведь на содержание данных может влиять всё, что находится в их замыкании. Это затрудняет работу сборщика мусора и проектирование архитектуры.
Многие, как и я, были твёрдо уверены, что приватные свойства — это что-то вроде вредной привычки и в целом не должно одобряться, или, тем более, использоваться, но на самом деле это не обман, чтобы набрать классы, а возможность использовать структуры данных, защищённые от утечек через замыкание. Теперь всё так, как и должно быть — нет объекта — нет проблем.
источник
2018 March 28
Монада Кедавра
Сегодня наконец реализовал подход, который давно уже хотелось опробовать: реакт-компоненты из асинхронных генераторов
источник
Монада Кедавра
props$ в аргументе — это асинхронный итератор, возвращающий пропсы по мере их поступления в компонент
источник
2018 March 30
Монада Кедавра
Закрытая сумма типов
источник
Монада Кедавра
И тотальная функция, определённая с помощью этого типа
источник
2018 April 03
Монада Кедавра
npm ERR! Invalid package name "🚀run"

😒
источник
2018 April 14
Монада Кедавра
Главная ошибка многих людей - они недооценивают pure js; "жс говно" вместо приветствия влечет за собой создание еще одного легаси проекта суперсета/компилируемого языка.

Первое что объединяет purescript с typescript - они оба решили, что они лучше знают, как надо

Результат, в целом, схожий, у одного итерабл-бессилие goo.gl/TJfFeH второй так и не смог отвязаться от бовера и суметь в es6
источник
2018 April 26
Монада Кедавра
Оптимальное решение зачастую бывает не самым логичным
источник
2018 April 30
Монада Кедавра
Задача языков программирования общего назначения — это возможность создавать DSL для конкретных задач
источник
2018 May 26
Монада Кедавра
A monad defines a class of programs whose subexpressions are incrementally generated from the outputs of previous expressions.
A comonad defines a class of programs that incrementally generate output from the substructure of previous expressions.

A monad adds structure by consuming values.
A comonad adds values by consuming structure.
источник