Мне что понравилось в ocaml, тк там у каждого модуля есть его сигнатура.
И ее можно явно описать (как интерфейс в kotlin), а можно понадеяться на то что типы всех функций внутри сойдутся с требуемыми.
Это позволяет независимо описывать модули, не имея явных интерефесов.
Но тк есть статическая типизация - то все равно либо все сойдет, либо не скомпилирутся.