исключение, деление на ноль, io, мутация, вызовы других функций — это всё разные виды сайд-эффектов, в Koka функции имеют как бы сдвоенный тип, один показывает тип как обычно, второй — перечень сайд-эффектов
То что-то наподобие того как в Haskell выделяется код с сайд-эффектами получается? На уровне системы типов видно что если результат завернут в IO, то там возможны сайд-эффекты и внутри чистых функий такую функцию не вызвать (вернее вызвать то можно, но получить результат нельзя)