(Следующее основано исключительно на наблюдении.)
Если у вас есть функция obj -> 'a
, вызовы этой функции не используются для определения / определения типа ее аргумента. Иллюстрация:
let writeLine (arg: obj) = System.Console.WriteLine(arg)
writeLine
- это obj -> unit
let square x =
writeLine x
x * x
В приведенной выше функции x
выводится как int
из-за (*)
. Если тип может быть ограничен obj
, то эта функция не будет работать (x
будет выводиться как obj
до использования (*)
, что приведет к ошибке вдоль строк: type obj
не поддерживает оператор (*)
).
Я думаю, что это хорошее дело. Нет необходимости ограничивать тип как obj
, потому что каждый тип уже неявно преобразуется в obj
. Это позволяет вашей программе быть более универсальной и обеспечивает лучшую совместимость с .NET BCL.
Короче говоря, obj
не имеет отношения к выводу типа (ууу!).