2

Fsharp.Text.Lexing's类型中的“arg00”是LexBuffer<char>.LexemeString什么?

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

1 回答 1

2

简短的回答是,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
于 2020-08-03T21:26:03.420 回答