功能输出函数名(Function to output function name)

2019-07-21 04:22发布

是否有可能在Haskell实现返回其自身的功能名称的功能?

一种可能的类型可以是(a -> b) -> String

Answer 1:

你想一个函数,函数参数,并返回对应于该函数的名称定义网站的变量名?

这不是没有可能的元编程,这通常是你做错了什么:)一个标志。 但是,假设你没有,实现在正确的方向的东西的一种方法是通过模板哈斯克尔 ,它可以在唯一的名称(如何编译器名字的东西)获得。 例如

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)"

现在我们知道了很多关于变量。 所以,你可以通过传递一个名称的函数(通过“F),而大于f本身玩游戏。

你一定是在反射和元编程的世界虽然如此,这将有助于更多地了解你正在尝试做的。



Answer 2:

为了澄清穿上帖子中提到的东西:没有功能在Haskell的名字。 有可以结合的功能绑定,但如果我有这样的功能(调用它getName ),你寻求然后你会想到这回:

let f x = x
    g   = f
    h   = f
in  getName g == getName h


Answer 3:

我缺少的东西吗? 这个函数返回了自己的函数名。

Prelude> let myNameIs::(a->b) -> String; myNameIs f = "myNameIs"
Prelude> :type myNameIs
myNameIs :: (a -> b) -> String
Prelude> myNameIs myNameIs
"myNameIs"


Answer 4:

我不知道你需要它,但也许一个简单的解决方案就足够了? 像这样:

data NamedFunction a b = NamedFunction { 
    name :: String,
    apply :: a -> b
}

timesTwo :: NamedFunction Int Int
timesTwo = NamedFunction "timesTwo" (\x -> 2 * x)

您可以使用如下:

ghci> timesTwo `apply` 7
14
ghci> name timesTwo
"timesTwo"

然后,您可以编写自己的版本(.)

-- contrast (.)  ::    (b -> c) ->          (a -> b) ->         (a -> c)
compose :: NamedFunction b c -> NamedFunction a b -> NamedFunction a c
compose (NamedFunction n1 f1) (NamedFunction n2 f2) = 
     NamedFunction (n1++ " . " ++ n2) (f1 . f2)

在ghci的:

ghci> let f = timesTwo `compose` timesTwo in (f `apply` 7, name f) 
(28,"timesTwo . timesTwo")

你必须重新实现自己的版本的mapfilter等,以及你一定会以后碰到其他的问题,但也许这是你所需要的...



文章来源: Function to output function name