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