Идея такая:
Пользователь пишет только выражения состоящие из атомов и кортежей как литералов, вызовов функций и биндингов с паттерн-матчингом.
По сути функция есть биндинг с аргументами.
Типы пользователь не определяет, НО
Для любого множества аргументов функции есть множество результатов функции.
Такие множества и есть как бы типы.
То есть если я написал функцию
let foo a = a + 1
то "тип" foo integer - integer а тип foo 2 - 3
a тип foo "bla" - !