如何在haskell中获取变量名称

时间:2011-10-25 23:12:08

标签: haskell

我来到haskell有一些c背景知识,并想知道是否有模拟

#define print( a ) printf( "%s = %d\n", #a, a )

int a = 5;
print( a );

应打印

a = 5

3 个答案:

答案 0 :(得分:21)

这是提到的TH解决方案:

{-# LANGUAGE TemplateHaskell #-}
module Pr where
import Language.Haskell.TH
import Language.Haskell.TH.Syntax

pr :: Name -> ExpQ
pr n = [| putStrLn ( $(lift (nameBase n ++ " = ")) ++ show $(varE n) ) |]

然后在另一个模块中:

{-# LANGUAGE TemplateHaskell #-}
import Pr
a = "hello"
main = $(pr 'a)

答案 1 :(得分:19)

如果打开CPP语言扩展,则可以在Haskell中使用相同的#define技巧。 或者您可以使用Template Haskell来获得相同的效果。

但是在纯Haskell中它是不可能的,因为它违反了alpha转换的原则,即重命名绑定变量(以卫生方式)不应该改变程序语义。

答案 2 :(得分:3)

{-#LANGUAGE CPP#-}
import Text.Printf
#define print( a ) printf "%s = %d\n" (show a) a 

main = do  let a = (5 :: Int)
           print( a ) 



 $ ghci a.hs
 *Main> main
 5 = 5