express-0.1.1: Dynamically-typed expressions involving applications and variables.

Copyright(c) 2019 Rudy Matela
License3-Clause BSD (see the file LICENSE)
MaintainerRudy Matela <rudy@matela.com.br>
Safe HaskellSafe
LanguageHaskell2010

Data.Express.Express

Description

Defines the Express type class.

Synopsis

Documentation

class Typeable a => Express a where Source #

Express typeclass instances provide an expr function that allows values to be deeply encoded as applications of Exprs.

expr False  =  val False
expr (Just True)  =  value "Just" (Just :: Bool -> Maybe Bool) :$ val True

The function expr can be contrasted with the function val:

  • val always encodes values as atomic Value Exprs -- shallow encoding.
  • expr ideally encodes expressions as applications (:$) between Value Exprs -- deep encoding.

Depending on the situation, one or the other may be desirable.

Instances can be automatically derived using the TH function deriveExpress.

The following example shows a datatype and its instance:

data Stack a = Stack a (Stack a) | Empty
instance Express a => Express (Stack a) where
  expr s@(Stack x y) = value "Stack" (Stack ->>: s) :$ expr x :$ expr y
  expr s@Empty       = value "Empty" (Empty   -: s)

To declare expr it may be useful to use auxiliary type binding operators: -:, ->:, ->>:, ....

For types with atomic values, just declare expr = val

Methods

expr :: a -> Expr Source #

Instances
Express Bool Source # 
Instance details

Defined in Data.Express.Express

Methods

expr :: Bool -> Expr Source #

Express Char Source # 
Instance details

Defined in Data.Express.Express

Methods

expr :: Char -> Expr Source #

Express Int Source # 
Instance details

Defined in Data.Express.Express

Methods

expr :: Int -> Expr Source #

Express Integer Source # 
Instance details

Defined in Data.Express.Express

Methods

expr :: Integer -> Expr Source #

Express Ordering Source # 
Instance details

Defined in Data.Express.Express

Methods

expr :: Ordering -> Expr Source #

Express () Source # 
Instance details

Defined in Data.Express.Express

Methods

expr :: () -> Expr Source #

Express a => Express [a] Source # 
Instance details

Defined in Data.Express.Express

Methods

expr :: [a] -> Expr Source #

Express a => Express (Maybe a) Source # 
Instance details

Defined in Data.Express.Express

Methods

expr :: Maybe a -> Expr Source #

(Integral a, Show a, Express a) => Express (Ratio a) Source # 
Instance details

Defined in Data.Express.Express

Methods

expr :: Ratio a -> Expr Source #

(Express a, Express b) => Express (Either a b) Source # 
Instance details

Defined in Data.Express.Express

Methods

expr :: Either a b -> Expr Source #

(Express a, Express b) => Express (a, b) Source # 
Instance details

Defined in Data.Express.Express

Methods

expr :: (a, b) -> Expr Source #

(Express a, Express b, Express c) => Express (a, b, c) Source # 
Instance details

Defined in Data.Express.Express

Methods

expr :: (a, b, c) -> Expr Source #

(Express a, Express b, Express c, Express d) => Express (a, b, c, d) Source # 
Instance details

Defined in Data.Express.Express

Methods

expr :: (a, b, c, d) -> Expr Source #

(Express a, Express b, Express c, Express d, Express e) => Express (a, b, c, d, e) Source # 
Instance details

Defined in Data.Express.Express

Methods

expr :: (a, b, c, d, e) -> Expr Source #

(Express a, Express b, Express c, Express d, Express e, Express f) => Express (a, b, c, d, e, f) Source # 
Instance details

Defined in Data.Express.Express

Methods

expr :: (a, b, c, d, e, f) -> Expr Source #

(Express a, Express b, Express c, Express d, Express e, Express f, Express g) => Express (a, b, c, d, e, f, g) Source # 
Instance details

Defined in Data.Express.Express

Methods

expr :: (a, b, c, d, e, f, g) -> Expr Source #

(Express a, Express b, Express c, Express d, Express e, Express f, Express g, Express h) => Express (a, b, c, d, e, f, g, h) Source # 
Instance details

Defined in Data.Express.Express

Methods

expr :: (a, b, c, d, e, f, g, h) -> Expr Source #

(Express a, Express b, Express c, Express d, Express e, Express f, Express g, Express h, Express i) => Express (a, b, c, d, e, f, g, h, i) Source # 
Instance details

Defined in Data.Express.Express

Methods

expr :: (a, b, c, d, e, f, g, h, i) -> Expr Source #

(Express a, Express b, Express c, Express d, Express e, Express f, Express g, Express h, Express i, Express j) => Express (a, b, c, d, e, f, g, h, i, j) Source # 
Instance details

Defined in Data.Express.Express

Methods

expr :: (a, b, c, d, e, f, g, h, i, j) -> Expr Source #

(Express a, Express b, Express c, Express d, Express e, Express f, Express g, Express h, Express i, Express j, Express k) => Express (a, b, c, d, e, f, g, h, i, j, k) Source # 
Instance details

Defined in Data.Express.Express

Methods

expr :: (a, b, c, d, e, f, g, h, i, j, k) -> Expr Source #

(Express a, Express b, Express c, Express d, Express e, Express f, Express g, Express h, Express i, Express j, Express k, Express l) => Express (a, b, c, d, e, f, g, h, i, j, k, l) Source # 
Instance details

Defined in Data.Express.Express

Methods

expr :: (a, b, c, d, e, f, g, h, i, j, k, l) -> Expr Source #