LexBuffer<char>.LexemeString 类型中的 "arg00" 是什么?
What is that "arg00" in the type of LexBuffer<char>.LexemeString?
Fsharp.Text.Lexing
的 LexBuffer<char>.LexemeString
类型中的“arg00”是什么?
> LexBuffer<char>.LexemeString;;
val it : arg00:LexBuffer<char> -> string
简短的回答是 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>
但是,如果您定义一个静态成员并访问它,那么编译器仍然会尝试打印参数名称,但无法访问它们(因为该成员现在已变成一个值),因此它会打印隐式生成像 arg00
:
这样的名字
> type A =
static member Foo a b = a + b;;
type A = (...)
> A.Foo;;
val it : arg00:int -> arg10:int -> int
Fsharp.Text.Lexing
的 LexBuffer<char>.LexemeString
类型中的“arg00”是什么?
> LexBuffer<char>.LexemeString;;
val it : arg00:LexBuffer<char> -> string
简短的回答是 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>
但是,如果您定义一个静态成员并访问它,那么编译器仍然会尝试打印参数名称,但无法访问它们(因为该成员现在已变成一个值),因此它会打印隐式生成像 arg00
:
> type A =
static member Foo a b = a + b;;
type A = (...)
> A.Foo;;
val it : arg00:int -> arg10:int -> int