    --
    -- | Names of haskell functions used in the Pl code
    --
    module Lambdabot.Plugin.Haskell.Pl.Names where

    import Lambdabot.Plugin.Haskell.Pl.Common

    -- | Expressions with holes
    -- No MLambda here because we only consider closed Terms (no alpha-renaming!).
    -- Has to be in this module, otherwise we get recursion
    data MExpr
      = MApp  !MExpr !MExpr  -- ^ Application
      | Hole  !Int           -- ^ Hole/argument where another expression could go
      | Quote !Expr
      deriving MExpr -> MExpr -> Bool
    (MExpr -> MExpr -> Bool) -> (MExpr -> MExpr -> Bool) -> Eq MExpr
    forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
    $c== :: MExpr -> MExpr -> Bool
    == :: MExpr -> MExpr -> Bool
    $c/= :: MExpr -> MExpr -> Bool
    /= :: MExpr -> MExpr -> Bool
    Eq

    -- Names
    idE, flipE, bindE, extE, returnE, consE, appendE, nilE, foldrE, foldlE, fstE,
      sndE, dollarE, constE, uncurryE, curryE, compE, headE, tailE, sE, commaE,
      fixE, foldl1E, notE, equalsE, nequalsE, plusE, multE, zeroE, oneE, lengthE,
      sumE, productE, concatE, concatMapE, joinE, mapE, fmapE, fmapIE, subtractE,
      minusE, liftME, apE, liftM2E, seqME, zipE, zipWithE,
      crossE, firstE, secondE, andE, orE, allE, anyE :: MExpr
    idE :: MExpr
    idE        = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "id"
    flipE :: MExpr
    flipE      = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "flip"
    constE :: MExpr
    constE     = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "const"
    compE :: MExpr
    compE      = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Inf  String
    "."
    sE :: MExpr
    sE         = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "ap"
    fixE :: MExpr
    fixE       = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "fix"
    bindE :: MExpr
    bindE      = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Inf  String
    ">>="
    extE :: MExpr
    extE       = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Inf  String
    "=<<"
    returnE :: MExpr
    returnE    = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "return"
    consE :: MExpr
    consE      = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Inf  String
    ":"
    nilE :: MExpr
    nilE       = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "[]"
    appendE :: MExpr
    appendE    = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Inf  String
    "++"
    foldrE :: MExpr
    foldrE     = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "foldr"
    foldlE :: MExpr
    foldlE     = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "foldl"
    fstE :: MExpr
    fstE       = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "fst"
    sndE :: MExpr
    sndE       = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "snd"
    dollarE :: MExpr
    dollarE    = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Inf  String
    "$"
    uncurryE :: MExpr
    uncurryE   = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "uncurry"
    curryE :: MExpr
    curryE     = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "curry"
    headE :: MExpr
    headE      = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "head"
    tailE :: MExpr
    tailE      = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "tail"
    commaE :: MExpr
    commaE     = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Inf  String
    ","
    foldl1E :: MExpr
    foldl1E    = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "foldl1"
    equalsE :: MExpr
    equalsE    = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Inf  String
    "=="
    nequalsE :: MExpr
    nequalsE   = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Inf  String
    "/="
    notE :: MExpr
    notE       = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "not"
    plusE :: MExpr
    plusE      = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Inf  String
    "+"
    multE :: MExpr
    multE      = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Inf  String
    "*"
    zeroE :: MExpr
    zeroE      = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "0"
    oneE :: MExpr
    oneE       = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "1"
    lengthE :: MExpr
    lengthE    = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "length"
    sumE :: MExpr
    sumE       = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "sum"
    productE :: MExpr
    productE   = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "product"
    concatE :: MExpr
    concatE    = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "concat"
    concatMapE :: MExpr
    concatMapE = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "concatMap"
    joinE :: MExpr
    joinE      = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "join"
    mapE :: MExpr
    mapE       = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "map"
    fmapE :: MExpr
    fmapE      = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "fmap"
    fmapIE :: MExpr
    fmapIE     = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Inf  String
    "fmap"
    subtractE :: MExpr
    subtractE  = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "subtract"
    minusE :: MExpr
    minusE     = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Inf  String
    "-"
    liftME :: MExpr
    liftME     = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "liftM"
    liftM2E :: MExpr
    liftM2E    = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "liftM2"
    apE :: MExpr
    apE        = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Inf  String
    "ap"
    seqME :: MExpr
    seqME      = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Inf  String
    ">>"
    zipE :: MExpr
    zipE       = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "zip"
    zipWithE :: MExpr
    zipWithE   = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "zipWith"
    crossE :: MExpr
    crossE     = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Inf  String
    "***"
    firstE :: MExpr
    firstE     = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "first"
    secondE :: MExpr
    secondE    = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "second"
    andE :: MExpr
    andE       = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "and"
    orE :: MExpr
    orE        = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "or"
    allE :: MExpr
    allE       = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "all"
    anyE :: MExpr
    anyE       = Expr -> MExpr
    Quote (Expr -> MExpr) -> Expr -> MExpr
    forall a b. (a -> b) -> a -> b
    $ Fixity -> String -> Expr
    Var Fixity
    Pref String
    "any"

    a, c :: MExpr -> MExpr -> MExpr
    a :: MExpr -> MExpr -> MExpr
    a       = MExpr -> MExpr -> MExpr
    MApp
    c :: MExpr -> MExpr -> MExpr
    c MExpr
    e1 MExpr
    e2 = MExpr
    compE MExpr -> MExpr -> MExpr
    `a` MExpr
    e1 MExpr -> MExpr -> MExpr
    `a` MExpr
    e2
    infixl 9 `a`
    infixr 8 `c`