如何在 F# 中获取函数参数的名称?
How to get the name of function argument in F#?
我可以编写一个函数,其中 returns 函数的名称作为参数吗?
let funName f: string =
// returns the name of f.
例如,如果我将 printfn
作为参数传递给 funName,它会 returns "printfn".
> funName printfn;;
val it : string = "printfn"
编辑:我想编写一个函数 doc
,其中 returns 与给定函数关联的 XML 文档。
let doc f = // returns the XML documentation of the function `f`.
要使用类似 NuDoq 的方法检索函数的摘要,我想知道函数的名称。
我无法想象你为什么要这样做,而且我认为没有办法通过反射来做到这一点,但 F# Code Quotations 可能会让你走到一半。
open Microsoft.FSharp.Quotations
let rec funName = function
| Patterns.Call(None, methodInfo, _) -> methodInfo.Name
| Patterns.Lambda(_, expr) -> funName expr
| _ -> failwith "Unexpected input"
let foo () = 42
funName <@ foo @> // "foo"
但请注意,某些预定义的库函数具有不同的内部名称。
funName <@ printfn @> // "PrintFormatLine"
funName <@ id @> // "Identity"
请注意,从 F# 4.0 开始,class 类型可以自动引用它们的参数,与 kaefer 的答案相比,简化了调用站点:
open Microsoft.FSharp.Quotations
type DocumentGetter =
static member GetName([<ReflectedDefinition>]x:Expr<_->_>) =
match x with
| DerivedPatterns.Lambdas(_, Patterns.Call(_,methodInfo,_)) ->
methodInfo.Name
let f x y = x + y
DocumentGetter.GetName f
我可以编写一个函数,其中 returns 函数的名称作为参数吗?
let funName f: string =
// returns the name of f.
例如,如果我将 printfn
作为参数传递给 funName,它会 returns "printfn".
> funName printfn;;
val it : string = "printfn"
编辑:我想编写一个函数 doc
,其中 returns 与给定函数关联的 XML 文档。
let doc f = // returns the XML documentation of the function `f`.
要使用类似 NuDoq 的方法检索函数的摘要,我想知道函数的名称。
我无法想象你为什么要这样做,而且我认为没有办法通过反射来做到这一点,但 F# Code Quotations 可能会让你走到一半。
open Microsoft.FSharp.Quotations
let rec funName = function
| Patterns.Call(None, methodInfo, _) -> methodInfo.Name
| Patterns.Lambda(_, expr) -> funName expr
| _ -> failwith "Unexpected input"
let foo () = 42
funName <@ foo @> // "foo"
但请注意,某些预定义的库函数具有不同的内部名称。
funName <@ printfn @> // "PrintFormatLine"
funName <@ id @> // "Identity"
请注意,从 F# 4.0 开始,class 类型可以自动引用它们的参数,与 kaefer 的答案相比,简化了调用站点:
open Microsoft.FSharp.Quotations
type DocumentGetter =
static member GetName([<ReflectedDefinition>]x:Expr<_->_>) =
match x with
| DerivedPatterns.Lambdas(_, Patterns.Call(_,methodInfo,_)) ->
methodInfo.Name
let f x y = x + y
DocumentGetter.GetName f