.LexemeString? > LexBuffer.LexemeString;; val it : arg00:LexBuffer" /> .LexemeString? > LexBuffer.LexemeString;; val it : arg00:LexBuffer" /> .LexemeString? > LexBuffer.LexemeString;; val it : arg00:LexBuffer"/>

What is that "arg00" in the type of LexBuffer<char>.LexemeString?

60 Views Asked by At

What is that "arg00" in the type of Fsharp.Text.Lexing's LexBuffer<char>.LexemeString?

> LexBuffer<char>.LexemeString;;
val it : arg00:LexBuffer<char> -> string
1

There are 1 best solutions below

0
Tomas Petricek On BEST ANSWER

The short answer is that F# can sometimes keep track of argument names when printing the type of a function. In this case, arg00 is an implicit name generated by the compiler for the first argument of the LexemeString operation.

The longer answer is that F# is a bit inconsistent when dealing with function arguments. If you define a function using let, the output will include arguments:

> let foo a b = a + b;;
val foo : a:int -> b:int -> int

If you just a function as a value through its name, the result is treated as a function value (with parentheses around it) and the argument names are omitted:

> foo;;
val it : (int -> int -> int) = <fun:it@4-2>

However, if you define a static member and access it, then the compiler still attempts to print the argument names, but cannot access them (because the member has now been turned into a value) and so it prints implicitly generated names like arg00:

> type A = 
    static member Foo a b = a + b;;
type A = (...)

> A.Foo;;
val it : arg00:int -> arg10:int -> int

Related Questions in F#