简体   繁体   中英

How to get the name of function argument in F#?

Can I write a function which returns the name of the function given as the argument?

let funName f: string =
   // returns the name of f.

For example, if I pass printfn as an argument to funName, it returns "printfn".

> funName printfn;;
val it : string = "printfn"

EDIT: I wanted to write a function doc which returns the XML documentation associated with the given function.

let doc f = // returns the XML documentation of the function `f`.

To retrieve the summary of the function using something like NuDoq , I wanted to know the name of the function.

I cannnot imagine why you would want to do this and I do not think that there's a way to do this with reflection, but F# Code Quotations might get you halfway there.

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"

But note that certain predefined library functions have a divergent internal name.

funName <@ printfn @>   // "PrintFormatLine"
funName <@ id @>        // "Identity"

Note that as of F# 4.0, class types can automatically quote their arguments, simplifying the call site compared to kaefer 's answer:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM