Már láttuk az if elágazást, a feltételt nem kell zárójelbe tenni, a törzsét blokként kell megadni, lehet opcionálisan egy else ága és akárhány else if. A feltételének kötelező bool típusúnak lennie, nincs konverzió más típusról. Ha egy ágban a blokknak van értéke, akkor minden ágban kell lennie és ugyanolyan típusú értéknek.
A match kontrukció a C-beli switch általánosított és letisztult változata. Megkell adni hozzá egy értéket és ágakat, az ágaknak van egy címkéje amit illeszt majd az értékhez és egy törzse amit végre hajt ha illeszkedik.
Különbség a C-hez képest, hogy ha egy ág feltétele teljesül és végrehajtódik a törzse akkor a vezérlés nem „folyik” tovább a következő ágra, hanem a match blokk végére megy, nem kell explicit break-et megadni minden ág törzsében.
Az ágak egy mintával kezdődnek, majd => majd egy kifejezés, ami lehet blokk is. Több mintára is illeszhet egy ág, kombinálni lehet a | operátorral, numerikus tartományok megadása is lehetséges M..N, illetve a default ág megfelel a _-ra való illesztés, ez mindenre illeszkedik. Az ágaknak minden lehetséges esetet lekell fedniük.
Továbbá még az ágaknél megadhatóak őrfeltételek: if kifejezés. Ezeket patternguard-oknak nevezik. A kifejezés értéke bool kell legyen. A match szerkezet használható let változómegadásban is, de ekkor olyant kell megadni, aminél biztos tud illeszteni.
While ciklus: iterál amíg a feltétel igaz, a feltétel bool típusú. A törzsében adható break, ami megszakítja a ciklus végrehajtását és continue, ami az aktuális iterációt szakítja meg, és ugrik a következő kezdetére, a feltétel kiértékelésre(mint C++-ban).
Végtelen ciklus a loop kulcsszóval adhatunk, vagy a while true-val. Azonban ezekből is kilehet ugrania break kulcsszóval.
Számlálós ciklus: intervallumon vagy iterátorral: