Skip to Content

Patsy

Patsy is a library that provides a set of quasiquoters for declaring/using constructor/pattern synonyms in Haskell. You'll need GHC 7 or later to use it.

Code

You can find the latest version here.

Examples

You could use Patsy to define your own lists:

{-# LANGUAGE QuasiQuotes #-}

module PatsyLists where

import Language.Haskell.Patsy

data List a
  = Nil
  | Cons a (List a)
  deriving (Eq, Ord, Show)

[c| []     = Nil       |]
[c| x : xs = Cons x xs |]

myLength :: List a -> Int
myLength [c| [] |]     = 0
myLength [c| x : xs |] = 1 + myLength xs

instance Functor List where
  fmap f [c| [] |]     = [c| [] |]
  fmap f [c| x : xs |] = [c| f x : fmap f xs |]

picky :: Num a => List a -> Int
picky [c| [1, 2] |]   = 42
picky _               = 0

Notes and known issues

  • Patsy cheekily uses haskell-src-meta, so you should be able to get away with infix synonyms, type operators, the lot.
  • List literals (such as [1,2,3]) are expanded using whatever definitions you've provided for (:) and []. If either is missing, the literal will be left alone (i.e. produce a normal list).
  • The implementation is horrible. Seriously horrible. Try loading up the example and typing :browse if you don't believe me. Blame it on some of Template Haskell's limitations.
  • Due to the horrible implementation mentioned above, you have to be careful with export lists. Specifically, if you want a set of synonyms to work across multiple modules (which have been precompiled in particular), you should put them in a module on their own that has no export list.