В общем-то есть дешёвый вариант сделать опциональные параметры, но только для валуе типов: вводим в систему типов новый тип, который скрыт от пользователя OptParam, который по форме соответствует Option. Опциональные параметры выражаются таким типом. При передаче параметра соответственно значение инстанцируется, тем, что передали, а если параметр не передали, то функция сама инстанцирует параметр.