Что это за "arg00" в типе LexBuffer <char>.LexemeString? - PullRequest
2 голосов
/ 03 августа 2020

Что это за "arg00" в типе Fsharp.Text.Lexing LexBuffer<char>.LexemeString?

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

1 Ответ

2 голосов
/ 04 августа 2020

Короткий ответ заключается в том, что F # иногда может отслеживать имена аргументов при печати типа функции. В этом случае arg00 - это неявное имя, сгенерированное компилятором для первого аргумента операции LexemeString.

Более длинный ответ заключается в том, что F # немного несовместим при работе с аргументами функции. Если вы определяете функцию с помощью let, вывод будет включать аргументы:

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

Если вы просто указываете функцию как значение через ее имя, результат обрабатывается как значение функции (с круглыми скобками вокруг него ), а имена аргументов опускаются:

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

Однако, если вы определяете член stati c и получаете к нему доступ, то компилятор все равно пытается распечатать имена аргументов, но не может получить к ним доступ (поскольку теперь член был преобразован в значение), и поэтому он печатает неявно сгенерированные имена, такие как arg00:

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

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