[Haskell-cafe] Template Haskell question

Daniel Schüssler anotheraddress at gmx.de
Mon Apr 18 04:25:27 CEST 2011


Hello,

assuming you mean avoiding the import of Data.Map in the module *using* x, you 
can use name quotations:

A.hs: 

> {-# LANGUAGE TemplateHaskell #-}
> 
> module A where
> 
> import Data.Map 
> import Language.Haskell.TH
> 
> x = varE 'empty 
> 

B.hs:

> {-# LANGUAGE TemplateHaskell #-}
> module B where
> import A
> 
> a = $x 
>
> empty = "" -- No collision; the 'empty in A.hs becomes a fully qualified
>            -- name according to what's in scope in A.hs, so 'a' has type
>            -- Map k a

To avoid the import in A.hs too:

> module A where
> 
> import Language.Haskell.TH
> import Language.Haskell.TH.Syntax(mkNameG_v)
> 
> x = varE (mkNameG_v "containers-0.4.0.0" "Data.Map" "empty")
 
By the way, 'global' currently is a synonym for 'varE'; I guess it used to be 
something different and remains for backwards compatibility.

Cheers,
Daniel

On 2011-April-17 Sunday 18:42:15 Alexey Karakulov wrote:
> I'm interested if it's possible to use functions from some module without
> explicitly importing it. In ghci it's done on the fly, like this:
> 
> Prelude> Data.Map.empty
> Loading package array-0.3.0.2 ... linking ... done.
> Loading package containers-0.4.0.0 ... linking ... done.
> fromList []
> 
> But without gchi it seems impossible.
> 
> I have the file Test.hs:
> > {-# LANGUAGE TemplateHaskell #-}
> > module Test where
> > import Language.Haskell.TH
> > 
> > x :: ExpQ
> > x = global $ mkName "Data.Map.empty"
> 
> When I load it in ghci, all works:
> 
> $ ghci -XTemplateHaskell Test.hs
> *Test> $x
> Loading package pretty-1.0.1.2 ... linking ... done.
> Loading package array-0.3.0.2 ... linking ... done.
> Loading package containers-0.4.0.0 ... linking ... done.
> Loading package template-haskell ... linking ... done.
> fromList []
> 
> But when I try to use it from other module, it fails. File Main.hs:
> > {-# LANGUAGE TemplateHaskell #-}
> > module Main where
> > import Test
> > 
> > main = do
> > 
> >   print $x
> 
> $ runhaskell Main.hs
> 
> Main.hs:5:9:
>     Not in scope: `Data.Map.empty'
>     In the result of the splice:
>       $x
>     To see what the splice expanded to, use -ddump-splices
>     In the first argument of `print', namely `$x'
>     In the expression: print ($x)
> 
> --
> All the best,
> Alexey
> 
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe




More information about the Haskell-Cafe mailing list