Я пришел к 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