Большой код. Учимся генерировать F#-исходники с помощью Fantomas. Часть 3. Модули и типы
В этот раз почти без "фундаментальной" теории, просто очень подробный пошаговый разбор одного генератора. Что делаем, зачем, почему так, а не иначе, и т.д. По существу, ничего сложного, кодогенерация — это всего-лишь ещё одна предметная область со своей спецификой.
В этот раз почти без "фундаментальной" теории, просто очень подробный пошаговый разбор одного генератора. Что делаем, зачем, почему так, а не иначе, и т.д. По существу, ничего сложного, кодогенерация — это всего-лишь ещё одна предметная область со своей спецификой.
Хабр
Большой код. Учимся генерировать F#-исходники с помощью Fantomas. Часть 3. Модули и типы
В прошлых двух частях мы ознакомились с синтаксической моделью F#-кода и с инструментами для неё . Объёмный пример туда уже не влез, но необходимость в нём осталась. Так родились ещё две...
Большой код. Учимся генерировать F#-исходники с помощью Fantomas. Часть 4. Расширения, обобщения и методы
Заключительная часть цикла, а в ней тонны кода с пояснениями частного и общего характера. Результат похож на боевой генератор, но без потной борьбы с исключениями, которая, увы, сопровождает все реальные проекты.
Заключительная часть цикла, а в ней тонны кода с пояснениями частного и общего характера. Результат похож на боевой генератор, но без потной борьбы с исключениями, которая, увы, сопровождает все реальные проекты.
Хабр
Большой код. Учимся генерировать F#-исходники с помощью Fantomas. Часть 4. Расширения, обобщения и методы
В прошлой части мы научились определять собственные типы и модули. Мы облекли все достопримечательности в конкретные типы и теперь можем снабдить их индивидуальными свойствами-ребрами: В этой части...
Forwarded from Pavel S
Для интересующихся интересный доклад подъехал
https://youtu.be/2M4EwRZ5hf0?si=FU5CCY8bYQ8FyocZ
https://youtu.be/2M4EwRZ5hf0?si=FU5CCY8bYQ8FyocZ
YouTube
Дмитрий Сошников — Введение в теорию функционального программирования с примерами на F#
Ближайшая конференция — DotNext 2024, 10 — 11 сентября, Москва + online
Подробности и билеты: https://jrg.su/x2GKnA
— —
Чем дальше — тем больше функционального подхода к программированию мы видим вокруг нас. Это и функциональные компоненты в React, и пайплайны…
Подробности и билеты: https://jrg.su/x2GKnA
— —
Чем дальше — тем больше функционального подхода к программированию мы видим вокруг нас. Это и функциональные компоненты в React, и пайплайны…
Вычислительные выражения: 1. Введение
Древнее зло пробудилось.
На хабре вышел перевод первой части цикла по
Тема местами нелёгкая, но рекомендуется к изучению каждому. Даже если не будете писать свои билдеры, полезно внятно представлять, как они устроены внутри.
// Оригинал здесь, на случай если винтажные газогенераторы (типа меня) не узнали статью в гриме.
На хабре вышел перевод первой части цикла по
computation expressions
с F# for Fun and Profit.Тема местами нелёгкая, но рекомендуется к изучению каждому. Даже если не будете писать свои билдеры, полезно внятно представлять, как они устроены внутри.
// Оригинал здесь, на случай если винтажные газогенераторы (типа меня) не узнали статью в гриме.
Хабр
Вычислительные выражения: Введение
Скотт Влащин — безусловный гуру в мире F#, написавший введение в язык , которое рекомендуют новичкам вместо официального руководства . Группа энтузиастов давно (и с переменным успехом) пытается...
Вычислительные выражения: 2. Разбираемся с продолжениями
В этой главе объясняется суть работы
В этой главе объясняется суть работы
let!
, а также do!
, match!
и т.д., но пока без технических деталей.Хабр
Вычислительные выражения: разбираемся с продолжениями
В предыдущей статье мы увидели, как с помощью вычислительных выражений можно сокращать довольно сложный код. Вот код без вычислительных выражений: let log p = printfn "expression is %A" p let...
Воркшоп «Практические задачи решаем функционально»
Ещё двухчастное видео с dotnext: часть 1 и часть 2.
Классический REST API тестируют с помощью curl или Postman. Более новый gRPC тестировать сложнее, потому что на входе и на выходе у него бинарные данные. Нужна утилита, которая умеет сериализовать текстовые данные в бинарные и десериализовать их обратно. Задача кажется сложной, потому что языки описания схемы и данных Protobuf — достаточно развитые. Но решается она просто, если пользоваться правильным инструментом. Мы напишем утилиту на языке программирования F#, используя библиотеку FParsec. Научимся по описанию грамматики писать код и тесты для разбора, построим абстрактное синтаксическое дерево и разберёмся, как применять его для сериализации.
Ещё двухчастное видео с dotnext: часть 1 и часть 2.
Классический REST API тестируют с помощью curl или Postman. Более новый gRPC тестировать сложнее, потому что на входе и на выходе у него бинарные данные. Нужна утилита, которая умеет сериализовать текстовые данные в бинарные и десериализовать их обратно. Задача кажется сложной, потому что языки описания схемы и данных Protobuf — достаточно развитые. Но решается она просто, если пользоваться правильным инструментом. Мы напишем утилиту на языке программирования F#, используя библиотеку FParsec. Научимся по описанию грамматики писать код и тесты для разбора, построим абстрактное синтаксическое дерево и разберёмся, как применять его для сериализации.
YouTube
Марк Шевченко — Воркшоп «Практические задачи решаем функционально» (Часть 1)
Ближайшая конференция — DotNext 2024, 10 — 11 сентября, Москва + online
Подробности и билеты: https://jrg.su/x2GKnA
— —
Классический REST API тестируют с помощью curl или Postman. Более новый gRPC тестировать сложнее, потому что на входе и на выходе у него…
Подробности и билеты: https://jrg.su/x2GKnA
— —
Классический REST API тестируют с помощью curl или Postman. Более новый gRPC тестировать сложнее, потому что на входе и на выходе у него…
An incursion under C#. Протаскиваем F# в Godot
Вводная статья по связке F# и игрового движка, который на старте активно противится причинению добра. Потребовалось время, чтобы это сопротивление сломить. Данный текст — компиляция опыта по преодолению встреченных препятствий.
До сравнительного анализа F# vs C# vs GDScript дело не дошло. Но если давать оценки без подкрепления следующей статьёй, авансом, то в умелых руках F# хорошо взлетает на Godot, и по мере возрастания сложности начинает обыгрывать конкурентов. Полностью от C#-проекта избавиться не получится, но в перспективе он почти наверняка перестанет быть источником какой-либо информации и превратится в полностью зависимую детерминированную проекцию над Godot и
Вводная статья по связке F# и игрового движка, который на старте активно противится причинению добра. Потребовалось время, чтобы это сопротивление сломить. Данный текст — компиляция опыта по преодолению встреченных препятствий.
До сравнительного анализа F# vs C# vs GDScript дело не дошло. Но если давать оценки без подкрепления следующей статьёй, авансом, то в умелых руках F# хорошо взлетает на Godot, и по мере возрастания сложности начинает обыгрывать конкурентов. Полностью от C#-проекта избавиться не получится, но в перспективе он почти наверняка перестанет быть источником какой-либо информации и превратится в полностью зависимую детерминированную проекцию над Godot и
.fs
-файлами.Хабр
An incursion under C#. Протаскиваем F# в Godot
Вы когда-нибудь бывали на боевом задании? Что вы имеете ввиду? Вторжение под водой с целью взятия крепости, захваченной элитным подразделением, имеющим в своём распоряжении 15 управляемых снарядов с...
Вычислительные выражения: 4. Типы-обёртки
Под типами-обёртками подразумеваются типы, представляющие ядро билдеров, например:
В этой части говорится о связях данных типов с конструкциями
Под типами-обёртками подразумеваются типы, представляющие ядро билдеров, например:
'a option
, 'a Аsync
, Result<'ok, 'error>
и т.д. Их иногда называют M<'a>
в честь того самого слова на букву м
.В этой части говорится о связях данных типов с конструкциями
let!
, return
и return!
.Хабр
Вычислительные выражения: Типы-обёртки
В предыдущем посте мы познакомились с процессом "maybe", благодаря которому можно значительно упросить код, работающий с Option<T> . Типичное использование "maybe" выглядит так: let result =...
Вычислительные выражения: 5. Подробнее про типы-обёртки
В программе:
- Использование дженериков, недженериков и списков в качестве типов-обёрток.
- Правила построения каноничных билдеров.
- Реализация
В программе:
- Использование дженериков, недженериков и списков в качестве типов-обёрток.
- Правила построения каноничных билдеров.
- Реализация
for
.Хабр
Вычислительные выражения: Подробнее про типы-обёртки
В предыдущем посте мы познакомились с концепцией "типов-обёрток" и с тем, как они связаны с вычислительными выражениями. В этом посте мы разберёмся, какие типы можно использовать в качестве обёрток....
Вычислительные выражения: 6. Реализуем Zero и Yield
Полезно знать, как работает
Полезно знать, как работает
let!
, однако в реальности билдеры с этим механизмом характерны для абстракций уровня фреймворка. Для уровня бизнес-логики лучше определять локальные билдеры, которые больше напоминают модифицированные []
или seq {}
. Базой таких билдеров являются методы Zero
и Yield
.Хабр
Вычислительные выражения: Реализуем Zero и Yield
В прошлых статьях цикла мы разобрались со связыванием, функциями-продолжениями и типами-обёртками. Теперь мы, наконец, готовы к знакомству с методами классов-построителей. Обратите внимание, что...
Вычислительные выражения: 7. Реализуем Combine
Метод
Метод
Combine
отвечает за склеивание нескольких yield
. Связка из Zero
, Delay
, Yield
и Combine
даст минимальную полноценную версию списочного билдера.Хабр
Вычислительные выражения: Реализуем Combine
В предыдущем посте мы разбирались в методах Zero и Yield . В этом посте мы рассмотрим возврат из вычислительного выражения нескольких значений с помощью метода Combine . Обратите внимание, что...
Вычислительные выражения: 8. Реализуем Delay и Run
Метод
Метод
Delay
позволит откладывать вычисления, а то и вовсе игнорировать их, если этого требует выражение в билдере. Run
преобразует содержимое билдера во внешний результат на заключительном шаге. В статье он нужен для исполнения отложенных вычислений, которые породил Delay
, но в случае бытовых билдеров Run
часто выполняет роль builder.Build()
из мира ООП.Хабр
Вычислительные выражения: Реализуем Delay и Run
В последних постах мы разобрали основные методы ( Bind , Return , Zero и Combine ), нужные для создания собственного построителя вычислительных выражений. Предыдущий пост рассказывал о методе Combine...