The interpol package

[Tags:gpl, library, program, test]

This preprocessor enables variable interpolation in strings. See the file for details.

[Skip to Readme]


Versions 0.1.0, 0.2.0, 0.2.1, 0.2.2, 0.2.3
Dependencies base (==4.*), haskell-src-exts, regex-posix, syb [details]
License GPL-3
Author Alexandru Scvortov <>
Stability experimental
Category Source-tools, Language
Home page
Source repository head: git clone git://
Uploaded Sun Nov 13 02:26:08 UTC 2011 by AlexandruScvortov
Distributions NixOS:0.2.3
Downloads 1032 total (6 in the last 30 days)
0 []
Status Docs uploaded by user
Build status unknown [no reports yet]




Maintainer's Corner

For package maintainers and hackage trustees

Readme for interpol

Readme for interpol-0.2.1


variable interpolations


The interpol preprocessor parses Haskell source file before GHC and performs variable interpolation statically. Concretely, it replaces {identifier} patterns in literal strings with show identifier. For instance,

okVal = 23
"I have {okVal} apples."


"I have 23 apples."

This works on any type that has a Show instance and is safe, in the sense that it does not disable any of GHC's normal checks (i.e. interpolating a non-existing identifier or one whose type does not have a Show instance will result in the appropriate error).


This package is on Hackage. To install it, run:

cabal update
cabal install interpol


To use interpol, install the cabal package (and/or make sure that the interpol executable is in your path), and compile with the "-F -pgmF interpol" GHC options. For instance, one of the tests for this package is compiled with:

ghc -F -pgmF interpol Test/One.hs

Alternatively, you may specify the options in a GHC_OPTIONS pragma at the top of the file:

{-# OPTIONS_GHC -F -pgmF interpol #-}

Note that, unless you use this latter pragma, ghc-mod and other flymake-based Emacs modes will probably complain about unused variables.


The interpol preprocessor effectively does two things:

  1. it adds an import declaration for Text.Interpol, in order to bring the (^-^) operator into scope, and

  2. it replaces any occurrence of "\\{[A-z_][A-z0-9_]*}" in string literals with "^-^ <ident> ^-^".


"I have {okVal} apples."

actually becomes

("I have " ^-^ okVal ^-^ " apples.")

The (^-^) operator is a smarter version of (++): it shows its second argument before appending, but only if it is not already a String (i.e. it does not quote String values when interpolating).

Run the preprocessor manually and check out the source for details (seriously now, this README is longer than the source).