type floatType = float32
let a = 5.0
let b = float32 a // Works
let b' = floatType b // Does not work
Можно ли применить к типу аббревиатуры?Как отбросить до аббревиатуры типа?
type floatType = float32
let a = 5.0
let b = float32 a // Works
let b' = floatType b // Does not work
Можно ли применить к типу аббревиатуры?Как отбросить до аббревиатуры типа?
При написании float32 a
вы используете функцию Microsoft.FSharp.Core.Operators.float32
, которая делает явное преобразование в одноточечный поплавок без единиц.
Если вы хотите, чтобы подобное использование floatType
, можно добавить следующее к определениям:
let inline floatType a = float32 a
Теперь ваш код должен работать.
Да, вы можете использовать псевдоним типа для кастинга, но вы не выполняете кастинг, это не синтаксис для кастинга. В вашем примере вы используете explicit conversion.
Casting это другое дело, это "новообращенных" в супер-класса (до-литье) или подклассу (понижающего литье), увидеть эту модификацию вашего примера:
type floatType = float32
let a = box 5.0f
let b = a :?> float32
let b' = a :?> floatType
Это пример - отбрасывание вниз, и, как вы видите, оно работает с псевдонимом.
Так что невозможно отличить от float
до float32
, даже без аннотаций типа.
На самом деле в этом случае вы маскируете ** аббревиатуру типа 'floatType' с новым определением типа функции' floatType', который возвращает 'float32' – Petr
@Petr. Он больше не замаскирован, чем float32, не так ли? Аннотации типа будут по-прежнему работать, поскольку компилятор отличает использование как тип. Есть ли ситуация, в которой 'float32' будет работать, но' floatType' не будет, после обоих определений? – Vandroiy
Да, вы правы. Виноват – Petr