diff --git a/docs/projects/kyo-direct-plugin.md b/docs/projects/kyo-direct-plugin.md new file mode 100644 index 0000000..b04f107 --- /dev/null +++ b/docs/projects/kyo-direct-plugin.md @@ -0,0 +1,78 @@ +--- +tags: + - Проект 24/25 + - Программный проект + - Системы эффектов + - Инициативный +--- + +# Research plugin для direct-style вычислений в Scala с Kyo + +[Upstream issue](https://github.com/getkyo/kyo/issues/211) + +Kyo — новая библиотека для работы с алгебраическими эффектами в Scala. +Она поддерживает как стандартный монадический стиль для комбинации эффектов, +так и новый direct style. + +Например монадический стиль, с использованием `map` +```scala 3 title="monadic style" +val fibMonadic: Unit < Routes = AtomicRef + .init((0, 1, 1)) + .map(state => + Routes.add(_.get.in("fib").out(stringBody)): _ => + state + .updateAndGet((_, b, c) => (b, c, b + c)) + .map((a, _, _) => a.toString) + ) +``` + +В настоящее время переводится в следующий код с использованием direct style +```scala 3 title="direct style" +val fib: Unit < Routes = defer: + val state = await(AtomicRef.init[(Int, Int, Int)]((0, 1, 1))) + await( + Routes.add( + _.get.in("fib").out(stringBody) + ): _ => + defer: + val (a, _, _) = + await(state.updateAndGet((_, b, c) => (b, c, b + c))) + a.toString + ) +``` + +Видно, что в данном коде много лишних выражений, использование которых обусловлено +текущими ограничениями языка. Предлагается ввести новое ключевое слово `pure`, +при помощи которого возможно будет аннотировать функции, классы и их конструкторы, +таким образом, что внутри аннотированного кода нельзя будет использовать impure +конструкты языка, такие как `var`, `try`, `throw` и подобные, а также изменять +поведение типов с эффектами таким образом, что вместо типа эффекта при вызове +функций и методов будет использоваться итоговый тип, например: +```scala 3 +pure def x: Int < IO = IO(3).map(_ + 3) +``` +вызовет ошибку компиляции, так как тип `Int`, являющийся итоговым типом pending типа +`Int < IO`, являющимся типом выражения `IO(3)`, не имеет функции `map`. С другой стороны, +код +```scala 3 +pure def x: Int < IO = IO(3) + 3 +``` +скомпилируется и при вычислении получится 6. Исходный пример будет выглядеть примерно +так: +```scala 3 title="direct style pure" +pure def fib: Unit < Routes = + val state = AtomicRef.init[(Int, Int, Int)]((0, 1, 1)) + Routes.add( + _.get.in("fib").out(stringBody) + ): _ => + val (a, _, _) = + state.updateAndGet((_, b, c) => (b, c, b + c)) + a.toString +``` +Что не отличается от императивной версии того же кода, при этом сохраняя информацию +об используемых эффектах + +Итогом проекта должен являться готовый research plugin, имплементирующий +большую часть вышеописанной функциональности. +Работы очень много, в одиночку не управиться, поэтому на этот проект ищется +команда заинтересованных людей \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index f10b651..7676d72 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -6,6 +6,7 @@ nav: - Проекты: - projects/index.md - projects/sanskrit.md + - projects/kyo-direct-plugin.md - projects/dependobuf.md - projects/zksnark.md - projects/codeaswiki.md