Комментарии (20)
- Использование Datalog-подобных систем в разных контекстах: от CozoDB до CodeQL и от Rust до GPU-фреймворков.
- Обсуждение того, какие именно технологии используются в продакшене: от Datomic до CozoDB и от Soufflé до CodeQL.
- Разговор о том, какие технологии используются для запросов к данным: от SQL-подобных до Datalog-подобных.
- Обсуждение того, какие технологии используются для запросов к данным в контексте GPU: CUDA, HIP и SPIR-V.
Algebraic Effects in Practice with Flix
Алгебраические эффекты на практике в Flix
Алгебраические эффекты — уже не академия. Это рабочий инструмент, который сегодня делает код:
- Тестируемым — «что» отделено от «как»; mock-и и DI не нужны.
- Прозрачным — сигнатура функции сразу показывает все побочные действия (IO, сеть, исключения).
- Гибким — async/await, корутины, backtracking реализуются обычными библиотеками, без изменения языка.
В отличие от монад, эффекты понятны без теории категорий и работают «из коробки» в языке Flix.
Мотивирующий пример
Без эффектов:
def calculateSalary(base, percent) -> float:
# может отправить письмо бабушке
С эффектами (Flix):
def calculateSalary(base: Float64, percent: Float64): Float64 \ {Email} =
...
Сигнатура не лжёт: любой вызов Email будет отслежен компилятором.
Обработчики эффектов (интуиция)
Эффект = операция + обработчик.
Код бросает операцию, обработчик решает, что с ней делать.
eff Ask { // объявляем эффект
pub def ask(): String
}
def greet(): String \ Ask = // используем
"Hello " + Ask.ask()
def main(): Unit = // обрабатываем
println(greet() with Ask {
def ask() = "World"
})
Реальный проект: рекомендательная система фильмов
Задача: достать данные из SQLite, вызвать внешний AI-сервис, кешировать результат, логировать.
Эффекты: Db, Http, Log, Cache.
def recommend(user: String): List[Movie] \ {Db, Http, Log, Cache} =
Cache.getOrElse(user,
for {
prefs <- Db.query(user)
_ <- Log.info("Prefs loaded")
recs <- Http.post("ai.example.com", prefs)
_ <- Log.info("AI answered")
_ <- Cache.put(user, recs)
} yield recs)
Тест: подменяем обработчики на in-memory реализации — никаких реальных запросов.
Куда дальше
- Попробовать онлайн: https://play.flix.dev
- Документация: https://doc.flix.dev
- Репозиторий: https://github.com/flix/flix
Flix ещё молод, но уже поддерживает эффекты, регионы, структурную конкурентность и Datalog.
Комментарии (42)
- Участники восторгаются идеей алгебраических эффектов: они проще монад, решают «цветную» проблему функций и позволяют гибко компоновать побочные эффекты.
- Примеры уже есть: экспериментальная реализация в OCaml 5, библиотеки Effect и Effectively для TypeScript, языки Koka, Effekt, Unison.
- Отличие от ОО-интерфейсов: эффекты явно указывают контекстные требования (Net, IO) и позволяют подменять реализацию динамически, а не статически.
- Критика: система всё равно «окрашивает» код, требует прокидывать эффекты через весь стек вызовов и пока выглядит академично/громоздко.
- Практические вопросы: как скрыть «дебажный» вывод, не нарушая типов, и можно ли обойтись без переписывания сигнатур каждой промежуточной функции.
Mangle – a language for deductive database programming
Mangle — проект Google на GitHub.
Язык: Go.
Лицензия: Apache-2.0.
Описание
Mangle — это компилятор/интерпретатор логического языка, ориентированного на:
- анализ и трансформацию графов;
- декларативные запросы к данным;
- поддержку Datalog-подобного синтаксиса.
Ключевые особенности
- Компилирует логические правила в Go-код или исполняет напрямую.
- Поддерживает рекурсивные запросы и агрегации.
- Работает с in-memory и persistent-хранилищами.
Установка
go install github.com/google/mangle/cmd/mangle@latest
Быстрый старт
- Создай файл
example.mgl:edge("a", "b"). edge("b", "c"). path(X, Y) :- edge(X, Y). path(X, Z) :- edge(X, Y), path(Y, Z). - Запусти:
mangle example.mgl --query="path(\"a\", Z)"
Документация
Комментарии (14)
- Участники спорят, связан ли новый язык Google с «Deductive Database» из видео 3b1b: одни считают, что это очередной внутренний эксперимент, другие — просто «люди, которые веселятся под крылом Google».
- Поднимается вопрос, почему почти все инструменты расширяют «ванильный» Datalog: его ограничения делают расширения неизбежными.
- В треде упоминаются альтернативные языки запросов — PreQL/Trilogy, Malloy, PRQL, PathQuery — и обсуждается, как они соотносятся с SQL и реляционной алгеброй.
Dyna – Logic Programming for Machine Learning
Dyna — декларативный логический язык с весами для исследователей машинного обучения.
Он позволяет описывать что вычислять, не заботясь о как. Примеры:
c(I,K) += a(I,J) * b(J,K). % умножение матриц
fib(N) := fib(N-1)+fib(N-2). % числа Фибоначчи
phrase(X,I,K) max= phrase(Y,I,J)*phrase(Z,J,K)*rule(X,Y,Z). % CKY-разбор
История: проект начат в 2004 для сокращения разрыва между математикой и кодом.
- Dyna 1.0 добавил произвольные полукольца к Datalog.
- Dyna 2.0 убрал ограничение на единое полукольцо, разрешил свободные переменные, ленивые и энергичные вычисления, наследование через dynabases.
Актуальные исследования
- Реализация через реляционную алгебру и перезапись термов.
- Использование обучения с подкреплением для выбора оптимального порядка вычислений.
Ключевые статьи
- PhD M. Francis-Landau «Declarative Programming Via Term Rewriting» (2024).
Комментарии (15)
- Автор рад, что его PhD-исследование (язык Dyna3) попало на Hacker News.
- Dyna3 — это кложурная реализация Dyna, JIT-компилятор и «артефакт из будущего» по ощущениям читателей.
- Язык обобщает Datalog на произвольные полукольца, позволяя вероятностные выводы и динамическое программирование; схож со Scallop, но Scallop ориентирован на дифференцируемость и интеграцию с нейросетями.
- Пользователи спрашивают про «max=», «*» и связь с Prolog-грамматиками; Dyna использует переписывание термов с весами.
- Есть Python-, Clojure- и Java-API, но для продакшена нужны дополнительные годы разработки.