Как получить имя переменной в haskell

Я пришел к haskell, имеющему некоторое знание фона c, и интересно, есть ли аналог

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

int a = 5;
print( a );

который должен печатать

a = 5

?

Ответ 1

Здесь упоминается 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)

Ответ 2

Вы можете использовать тот же трюк #define в Haskell, если вы включите расширение языка CPP. Или вы можете использовать Template Haskell, чтобы получить тот же эффект.

Но в чистом Haskell это невозможно, потому что это нарушает принцип альфа-преобразования, т.е. переименование связанных переменных (по гигиеническому пути) не должно изменять семантику программы.

Ответ 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