Dmitrii Lobanov
Dmitrii Lobanov

Reputation: 4977

Explicit type parameters in let bindings in classes (error FS0665)

When I try to create some class like

type MyType () =
    let func<'T> () = ()

The compiler says that there's an error:

error FS0665: Explicit type parameters may only be used on 
              module or member bindings

But the MSDN says:

A let binding at the module level, in a type, or in a computation expression can have explicit type parameters. A let binding in an expression, such as within a function definition, cannot have type parameters.

Why documentation and compiler say different things?

Upvotes: 12

Views: 1200

Answers (2)

Dave
Dave

Reputation: 4468

To add to Tomas's answer, if you need a type parameter but won't have a value of that type you can use a type with a phantom type parameter. e.g.:

open System

type Foo() =
    member x.PrintType<'T> () = printfn "%s" typeof<'T>.Name

type TypeParameter<'a> = TP

let foo = Foo ()

let callFoo (typeParameter : TypeParameter<'a>) =
    foo.PrintType<'a> ()

callFoo (TP : TypeParameter<string>)
callFoo (TP : TypeParameter<DateTime>)

Upvotes: 5

Tomas Petricek
Tomas Petricek

Reputation: 243041

This appears to be a syntactic restriction on let bindings inside a class. However, you can still define a generic local function, you just have to specify the type parameters in type annotations:

type MyType () =
   let func (x : 'T) : 'T = x

I do not think this is explicitly syntactically forbidden by the specification, because the specification says that a class definition has the following structure:

type type-name patopt as-defnopt =
      class-inherits-declopt
      class-function-or-value-defnsopt
      type-defn-elements

and class-or-value-defn is defined as:

class-function-or-value-defn := attributesopt staticopt let recopt function-or-value-defns

where function-or-value-defns may be a function definition with explicit type parameters:

function-defn :=
inlineopt accessopt ident-or-op typar-defnsopt argument-pats return-typeopt = expr

Upvotes: 5

Related Questions