Но тогда я не смогу использовать вашу функцию например со своим MyFloat если явно не напишу convert в float/bigfloat, что для моего пользовательского типа может иметь мало смысла
Функция по типу foo(a,b) = a/b работает со всеми типами которы определили деление между собой (например даже для матриц), функция foo(a,b)::BigFloat = a/b работает только для типов результат деления которых можно сконвертировать в BigFloat. Производительности тут вообще ничто не добавляет
В целом достаточно сложно заставить себя писать в таком стиле без указаний типов, но в конце концов это даёт очень много преимуществ и производительность, что интересно, никак не страдает
Вообще Джулии не хватает какой нибудь хорошей книжки, которая бы все эти моменты разжевывала, а то приходиться до таких вещей из обсуждений как раз понимать
Явный тип, кстати, может быть, как мне кажется полезен при декларировании переменных. Что-нить типа: function f(x) local path::String if x > 10 path = "10" else path = "30" end .......... end В качестве подсказки и как удобный typeassert
В вашем случае да, имеет право на жизнь, но функция к примеру function foo(a, b) local r::Float64 if some_condition r = a/b else r = b/a end return r end страдает той же проблемой, что я описал
Так я к тому, что это может быть полезно, если вам почему-то нужно чтобы локальная переменная имела конкретный тип и вы хотите гарантировать что опечатка в какой-то из ветвей if вам это не сломает