volga
volga copied to clipboard
Comprehensions for Arrows and Monoidal categories
Volga
Release |
---|
Arrow and Symmetric Monoidal Category composition syntax helper
How to use:
Let's say you have type Process[Input, Output]
, you want to use process comprehensions for your type
- Define volga.Arr or volga.Symon instance for your type
- Import syntax extensions
import volga.syntax.comp._ import volga.syntax.cat._ import volga.syntax.symon._ // or import volga.syntax.arr._
- Prepare syntax composer for your type
orval process = arr[Process]
whereval process = symon[Process, Pair, One]
Pair
andOne
are tensor product type constructor and unit type for your Symon instance - write your arrows
val someProcess1: Process[Pair[A,B], Pair[X, Y]] = ... val someProcess2: Process[Pair[C, X], Z] = ... val someProcess3: Process[One, D] = ... val someProcess4: Process[Y, One] = ... val someProcess5: Process[Z, E] = ... val myProcess: Process[Pair[Pair[A, B], C], Pair[D, E]] = process{ (a, b, c) => val (x, y) = someProcess1(a, b) val z = someProcess2(c, x) ---- val d = someProcess3() someProcess4(y) val e = someProcess5(z) (d, e) }
Syntactic rules
-
a comprehension for arrow
proc: (X1, X2, ...) -> (Y1, Y2, ...)
or monoidal morphism (note left associativity of products)
proc: (Tensor(...(Tensor(X1, X2), ...) -> Tensor(...Tensor(Y1, Y2),..)
should form a lambda function having parameters of types
(V[X1], V[X2], ...) =>
-
last line in comprenension defined in (1.)
should be in the form
(y1, y2, ...)
or non-assigning applicationsomeProcess(z1, z2, ...)
wheresomeProcess
is an arrowproc: (Z1, Z2, ...) -> (Y1, Y2, ...)
or monoidal morpshism (note left associativity of products)
proc: (Tensor(...(Tensor(Z1, Z2), ...) -> Tensor(...Tensor(Y1, Y2),..)
-
to use some arrow
proc: (X1, X2, ...) -> (Y1, Y2, ...)
or monoidal morphism (note left associativity of products)
proc: (Tensor(...(Tensor(X1, X2), ...) -> Tensor(...Tensor(Y1, Y2),..)
you can write
val (y1, y2, ...) = proc(x1, x2, ...)
-
non-assigning construction
proc(x1, x2, ...)
could be used to dispose of the result of an arrow, or use morphism with unit domain
-
special block-separator
----
could be used to enforce the end of parallel block
Additional rules for symmetric monoidal categories
- Any variable defined in the lambda parameter clause or extracted as a result of morphism application should be used exactly one time
Limitations.
Volga syntax works by extending
your arrows and morphisms with the apply
methods which then are analyzed by the macros.
Types which have apply
method already
i.e. Function1
and cats.data.Kleisli
may not work.
Consider volga.data.Kleisli instead.