Efectos algebraicos
Efectos visibles en el tipo, handlers compositivos. Sin async/await que se propaga por toda la pila de llamadas.
Lenguaje funcional con efectos algebraicos y fibras aisladas. Sin recolector de basura, sin borrow checker.
Diseñado para que humanos y agentes lo escriban juntos.
effect Log {
log(msg: String) : Unit
}
fn greet(name: String) : Unit / Log {
Log.log("hello, #{name}")
}
fn main() {
handle {
greet("kaikai")
greet("world")
} with Log {
log(msg, resume) -> {
println("[INFO] #{msg}")
resume(())
}
}
}Efectos visibles en el tipo, handlers compositivos. Sin async/await que se propaga por toda la pila de llamadas.
Cuatro operadores, cuatro intenciones: |> aplica, | mapea, || aplana, |? filtra. Cada forma dice qué hace antes de leer la función.
Perceus reference counting + fibras aisladas. La memoria es por-fibra; no hay pausas globales.
Real<m/s> para medidas, monedas que no se mezclan, arenas con region { }. Información en el tipo, costo cero en runtime.
requires, ensures, Int where >= 0. Lo que hace SPARK, sin SMT solver.
Holes (?), --holes-json, diagnósticos JSON. Diseñado para que humanos y agentes escriban juntos.
Un programa completo y su salida. Este encadena los cuatro pipes sobre un rango para sumar los cuadrados pares.
fn cuadrado(n: Int) : Int = n * n
fn divisores(n: Int) : [Int] = [1, n]
fn es_par(n: Int) : Bool = n % 2 == 0
fn main() {
# `[1..4]` es un literal de rango — sin acumulador escrito a mano.
# `[1..10..2]` agrega un paso.
let total = [1..4] # [1, 2, 3, 4]
| cuadrado # [1, 4, 9, 16] (map)
|| divisores # [1, 1, 1, 4, 1, 9, 1, 16] (flat-map)
|? es_par # [4, 16] (filter)
|> list.sum # 20 (apply)
println("total=#{total}")
}$ kai run 06_pipes.kaitotal=20