Как стать автором
Обновить

Комментарии 13

Спасибо, Хаскелю, на мой взгляд, очень не хватает материала про то как из <непонятная хрень из алгебры> сделать что-то полезное.
Отличный пример того, как Хаскель позволяет реализовать сложный функционал в виде библиотеки. Во многих языках пришлось бы выбирать между непрактичным синтаксисом и добавлением поддержки на уровне языка. А здесь STM от разработчиков компилятора выглядит точто так же, как и STM от стороннего исследователя.

Вопрос #1: найдутся ли достаточно рискованные люди, чтобы попытаться при помощи такого подхода превзойти производительность существующей реализации STM в отдельных случаях?

Вопрос #2: реализация на С++ будет пытаться в точности повторить описанный подход (с операцией bind и множеством вложенных лямбд)? Или для постоения AST в плюсах есть какие-то трюки, чтобы сделать синтаксис более читаемым?
Спасибо :)

#1 Я таки хочу сделать оптимизацию своей STM и прогнать бенчмарки. Но вряд ли буду этим заниматься раньше мая, так что если есть рисковые люди, то welcome.

#2 В С++ все очень плохо с монадами, потому что нет do-нотации, а делать все на лямбдах — очень неуклюже. Но выбора у меня нет, мне нужен именно комбинаторный STM, так что без вариантов: bind, лямбды, вот это вот все. То есть, порт на C++ концептуально один в один, но отличия в синтаксисе все же будут. Еще много проблем с тем, что в С++ нет ADT, и работа со сложными типами превращается в какой-то сущий ад. Тем не менее, мне уже удалось реализовать почти все, что я хотел, и последним штрихом я добавляю разные комбинаторы, пытаюсь придумать более простой синтаксис, а также портирую задачу обедающих философов. Иными словами, я на финишной прямой.
#2. Попробуйте поиграться с корутинами. co_await и co_return дают возможность криво-косо сделать do-нотацию для подкласса линейных монад, коей является STM.
Ох, корутинов мне еще не хватало! Они уже зарелизены, или надо тащить экспериментальные либы/компиляторы? Это те, которые Нишанов делал? Он, кажется, компилятор от MS использовал.

Идея интересная. Пусть повертится в подкорке.

На самом деле, чуваки даже do-нотацию эмулировали с помощью бустовой магии:
github.com/evgeny-panasyuk/monad_do

У меня просто времени нет, чтобы это повторить, да и Буст тянуть не хочется… Все же можно нечто похожее сделать с помощью макросов и проксей.
Корутины да, Нишановские. Есть в clang, но отдельным TS'ом, поэтому надо указывать `-fcoroutines-ts -stdlib=libc++`. И к релизу C++20 они могут немного поменяться — в Джексонвилле как раз обсуждали, как бы их сделать более монадическими, чтобы всякие Either… простите, std::expected и прочие через них выражались. Над соответствующим пропозалом работает весьма прошаренный чувак из гугла, да и Гор его поддерживает, так что, возможно, будет успех.

do-нотацию, конечно, можно сделать макросами, но лично мой бзик — пытаться всё подряд сделать без них.
BTW, я таки сделал STM для C++. И рассказал об этом на C++ Russia 2018. Видео пока не доступно, а слайды прикреплю.

Библиотека cpp_stm_free
Задача обедающих философов
Слайды: «Функциональный подход к Software Transactional Memory» (C++ Russia 2018)
А про подклассы монад я ничего не знаю. Где бы почитать?
Я что-то сходу ничего адекватного не смог найти, теперь я даже не уверен, где я сам это вообще видел :)

Ну вот List не линейная монада, а Maybe, Either, STM, какой-нибудь аттопарсековский Parser — линейная.
Что-то я не вижу между ними какой-либо существенной разницы, которая указывала бы на «линейность» (что это вообще значит). А другие монады?
Cont?
Free?
Reader?
Writer?
Разве не логичнее при смене стейта на Eating брать вилки?
Посмотрел на сниппет и увидел, что он неправильный. Исправил.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.