В другом месте вашего кода должно быть что-то не так.Если вы сбросите F # Interactive, откроете новый пустой файл F # Script и вставите следующий код (а затем запустите его в FSI), то у меня все будет работать нормально:
type Vector3<[<Measure>]'u> =
struct
val x:float32<'u>
val y:float32<'u>
val z:float32<'u>
end
new(x, y, z) = { x = x; y = y; z = z }
[<Measure>] type N
let f = Vector3(0.f<N>, 0.f<N>, 0.f<N>)
Я бы порекомендовал написать кодиспользование неявного синтаксиса конструктора, который является более лаконичным и более идиоматическим F # (объявление struct .. end
все еще разрешено, но оно использовалось главным образом в старых версиях F #).Конструктор по умолчанию, похоже, не работает в этом сценарии, но вы можете использовать статический член:
[<Struct>]
type Vector3<[<Measure>]'u>(x:float32<'u>, y:float32<'u>, z:float32<'u>) =
member this.X = x
member this.Y = y
member this.Z = z
static member Empty : Vector3<'u> = Vector3(0.f<_>, 0.f<_>, 0.f<_>)
[<Measure>] type N
let f1 = Vector3<N>.Empty
let f2 = Vector3(0.f<N>, 0.f<N>, 0.f<N>)
f1.X + f2.X