Coming from C#

C#'s nullable reference types are opt-in and warn; in Keal they are the type system and they refuse. Beyond that: no inheritance, no properties, no LINQ — but records, pattern matching and string interpolation will all feel like home.

ConceptC#Keal
Recordrecord P(double X);record P(val x: Float)
Classclass C { int N { get; set; } }class C(var n: Int)
Nullablestring? sval s: String?
Null-coalescings ?? "d"s ?: "d"
Null-conditionals?.Lengths?.length
Pattern switchn switch { 0 => … }when (n) { 0 -> … }
Type patternif (o is Circle c)when (o) { is Circle(r) -> … }
GenericT First<T>(List<T> xs)func first<T>(xs: List<T>): T
Interfaceinterface IOrdtrait Ord
Interpolation$"hello {name}""hello ${name}"
Asyncasync Task<T> / awaitactors: spawn / send / run

What will surprise you

Nullability refuses, it does not warn

String and String? are different types, always, with no flag to turn it off and no annotation to forget.

No properties, no hidden work

A field access is a field access. If something computes, it is a method and it has parentheses.

No LINQ, but the methods are there

map, filter, fold, and a lazy Sequence pipeline written in Keal itself — nothing runs until a terminal operation pulls.

No runtime to install

keal build produces a native executable with no VM under it, and the compiler itself has zero dependencies.