输出功能名称的功能

Stu*_*ton 7 haskell metaprogramming template-haskell

在Haskell中是否可以实现一个返回其自己的函数名的函数?

可能的类型可能是(a -> b) -> String.

Don*_*art 15

你想要一个带有函数参数的函数,并返回与该函数名称对应的定义站点变量名吗?

这可能不是没有元编程,这通常表明你做错了:).但假设你不是,通过模板Haskell可以获得正确方向的一种方法,它可以获得唯一的名称(编译器如何命名).例如

Prelude Language.Haskell.TH> :set -XTemplateHaskell
Prelude Language.Haskell.TH> let f x y = x + y
Prelude Language.Haskell.TH> $( stringE . show =<< reify 'f )

     "VarI f_1627394057
                (ForallT [PlainTV a_1627394063]
                         [ClassP GHC.Num.Num [VarT a_1627394063]]
                              (AppT (AppT ArrowT (VarT a_1627394063)) 
                                    (AppT (AppT ArrowT (VarT a_1627394063)) 
                                         (VarT a_1627394063)))) 
                         Nothing (Fixity 9 InfixL)"
Run Code Online (Sandbox Code Playgroud)

现在我们对变量了解很多.因此,您可以通过将名称传递给函数(通过'f)而不是f本身来玩游戏.

你当然是在反思和元编程的世界,所以它将有助于更多地了解你想要做什么.


J. *_*son 6

澄清dons'post中提到的内容:没有函数在Haskell中有名字.有绑定可以绑定函数,但如果我在getName你寻求的时候有这样的函数(调用它)那么你期望它返回什么:

let f x = x
    g   = f
    h   = f
in  getName g == getName h
Run Code Online (Sandbox Code Playgroud)