Ошибка компиляции F #: приложение непредвиденного типа - PullRequest
9 голосов
/ 30 апреля 2010

В F # дан следующий класс:

type Foo() =
    member this.Bar<'t> (arg0:string) = ignore()

Почему следующий компилятор:

let f = new Foo()
f.Bar<Int32> "string"

Пока не скомпилируется следующее:

let f = new Foo()
"string" |> f.Bar<Int32> //The compiler returns the error: "Unexpected type application"

1 Ответ

14 голосов
/ 30 апреля 2010

Похоже, что предоставление параметров типа при обработке метода как значения первого класса не поддерживается. Я проверил F # спецификацию и вот несколько важных битов:

14.2.2 Поиск по номеру изделия
[Если выражение приложения начинается с:]

  • <types> expr , затем используйте <types> в качестве аргументов типа и expr в качестве выражения аргумент.
  • expr , затем используйте expr в качестве аргумента выражения.
  • в противном случае не используйте аргументы выражения или аргументы типа.
  • Если [метод] помечен RequiresExplicitTypeArguments атрибут, тогда аргументы явного типа должны иметь было дано.

Если вы указываете аргументы типа и аргументы, то применяется первый случай, но, как вы можете видеть, спецификация также требует некоторых реальных аргументов. Я не совсем уверен, что является причиной этого.

В любом случае, если вы используете параметр типа где-либо в сигнатуре типа члена, то вы можете указать его с помощью аннотаций типа, таких как:

type Foo() = 
  member this.Bar<´T> (arg0:string) : ´T = 
    Unchecked.defaultof<´T>

let f = new Foo()
"string" |> (f.Bar : _ -> Int32)

С другой стороны, если вы не используете параметр type где-либо в сигнатуре, то я не совсем уверен, зачем он вам нужен. Если вам это нужно только для некоторой обработки во время выполнения, вы можете принять представление типа времени выполнения в качестве аргумента:

type Foo() = 
  member this.Bar (t:Type) (arg0:string) = ()

let f = new Foo() 
"string" |> f.Bar typeof<Int32>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...