diff --git a/docs/projects/kyo-direct-plugin.md b/docs/projects/kyo-direct-plugin.md index b04f107..f0c8eef 100644 --- a/docs/projects/kyo-direct-plugin.md +++ b/docs/projects/kyo-direct-plugin.md @@ -14,8 +14,9 @@ Kyo — новая библиотека для работы с алгебр Она поддерживает как стандартный монадический стиль для комбинации эффектов, так и новый direct style. -Например монадический стиль, с использованием `map` -```scala 3 title="monadic style" +Например, монадический стиль, с использованием `map` + +```scala val fibMonadic: Unit < Routes = AtomicRef .init((0, 1, 1)) .map(state => @@ -27,7 +28,8 @@ val fibMonadic: Unit < Routes = AtomicRef ``` В настоящее время переводится в следующий код с использованием direct style -```scala 3 title="direct style" + +```scala val fib: Unit < Routes = defer: val state = await(AtomicRef.init[(Int, Int, Int)]((0, 1, 1))) await( @@ -48,18 +50,23 @@ val fib: Unit < Routes = defer: конструкты языка, такие как `var`, `try`, `throw` и подобные, а также изменять поведение типов с эффектами таким образом, что вместо типа эффекта при вызове функций и методов будет использоваться итоговый тип, например: -```scala 3 + +```scala pure def x: Int < IO = IO(3).map(_ + 3) ``` + вызовет ошибку компиляции, так как тип `Int`, являющийся итоговым типом pending типа `Int < IO`, являющимся типом выражения `IO(3)`, не имеет функции `map`. С другой стороны, код -```scala 3 + +```scala pure def x: Int < IO = IO(3) + 3 ``` + скомпилируется и при вычислении получится 6. Исходный пример будет выглядеть примерно так: -```scala 3 title="direct style pure" + +```scala pure def fib: Unit < Routes = val state = AtomicRef.init[(Int, Int, Int)]((0, 1, 1)) Routes.add( @@ -69,6 +76,7 @@ pure def fib: Unit < Routes = state.updateAndGet((_, b, c) => (b, c, b + c)) a.toString ``` + Что не отличается от императивной версии того же кода, при этом сохраняя информацию об используемых эффектах