Применять явные аргументы типа - PullRequest
5 голосов
/ 18 мая 2011

У меня есть общая функция, в которой легко заставить компилятор выводить неверные параметры типа.Параметры типа управляют только возвращаемым типом, и если я случайно пропущу аннотацию типа, компилятор выведет obj.

Как сделать ошибку времени компиляции для вызова моей функции без явного указанияпараметры типа?Функция Unchecked.defaultof работает так, как мне хотелось бы:

> Unchecked.defaultof;;

  Unchecked.defaultof;;
  ^^^^^^^^^^^^^^^^^^^

stdin(1,1): error FS0685: The generic function 'defaultof' must be given explicit type argument(s)

Ответы [ 2 ]

10 голосов
/ 18 мая 2011

Функция defaultof использует специальный атрибут.Исходный код F #, опять же, полезен.Реализация функции находится в prim-types.fs, но атрибут добавляется в файл интерфейса prim-types.fsi.Комбинированная декларация будет выглядеть так:

[<RequiresExplicitTypeArguments>] 
let inline unsafeDefault<'T> : 'T = (# "ilzero !0" type ('T) : 'T #)

Встроенный IL (# ... #) ограничен ядром F #, но декларация может использоваться любым.

Атрибут можно найти в разделе 16 (стр. 217) спецификации F # :

При применении к функции или методу F # указывает, чтофункция или метод должны иметь явные аргументы типа при использовании.Например, typeof<int>.Этот атрибут должен использоваться только в сборках F #.

7 голосов
/ 18 мая 2011
...