Как указывает Ганеш, это техническое ограничение компилятора F # (и среды выполнения .NET), потому что сокращение типа просто заменяется фактическим типом во время компиляции. В результате, если вы напишите функцию:
let foo (a:MyType) : MyType = a + 1
Компилятор скомпилирует его как метод .NET со следующей подписью:
int foo(int a);
Если фактический тип аббревиатуры был скрыт от пользователей библиотеки, то они не смогли бы распознать, что функция foo
фактически работает с MyType
(эта информация, вероятно, хранится в некотором F # специфические метаданные, но они недоступны для других языков .NET ...).
Возможно, лучший обходной путь для этого ограничения - определить тип как единичный дискриминируемый союз:
type MyType = MT of int
let foo (MT a) = MT(a + 1)
Работать с этим типом довольно удобно. Это добавляет некоторые накладные расходы (при создании значения типа создаются новые объекты), но это не должно быть большой проблемой в большинстве ситуаций.