我来到haskell有一些c背景知识,并想知道是否有模拟
#define print( a ) printf( "%s = %d\n", #a, a )
int a = 5;
print( a );
应打印
a = 5
答案 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