Почему я не могу передать аргументы с единицами измерения типам F #? - PullRequest
6 голосов
/ 10 ноября 2010

Предположим, я определил единицу измерения:

[<Measure>] type Blob

И мне нужен тип, который принимает значение в BLOB-объектах в секунду в качестве аргумента конструктора:

type Something(flowRate:double<Blob/s>) = ...

F # вызывает колебание: «double не ожидает аргументов типа, но здесь дан аргумент типа 1»

Я понимаю сообщение.Я бы подумал, что было очевидно, что я пытался сделать, хотя я признаю, что синтаксис, вероятно, неверно проверен.Вопрос в том, как мне выразить это отношение в коде?

1 Ответ

8 голосов
/ 10 ноября 2010

Как указывается в сообщении (в некотором роде), значения типа double не являются общими для измерения.Попробуйте float<Blob/s> вместо этого.Это немного странно, поскольку float является синонимом типа для double.Однако тип float<[<Measure>]'t> в некотором роде является отдельным отдельным типом.Аналогичная проблема возникает с single против float32, int32 против int и int8 против byte. Раздел 9.7 спецификации частично охватывает эту информацию.

Это особенно сбивает с толку, поскольку вы не можете определить свои собственные типы, которые отличаются только их мерностью:

type T = class end
type T<[<Measure>]'t> = class end //' Duplicate definition of type T
...