Skip to content
This repository has been archived by the owner. It is now read-only.
Make presentations for data types
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
src
.dir-locals.el
.gitignore
.travis.yml
LICENSE
README.md
Setup.hs
install-to-global-db.sh
lts-6.yaml
lts-7.yaml
present.cabal
present.org
remove-from-global-db.sh
stack.yaml

README.md

present

Make presentations for data types.

Install

Requires: GHC 7.10.3

Install globally into your GHC's global database (via stack) with:

$ sh install-to-global-db.sh

To remove it later:

$ sh remove-from-global-db.sh

To be added: install via stack install present, but it needs to be added to an LTS/nightly version first.

Customizing GHCi

Add to the following to your ~/.ghci:

:seti -XTemplateHaskell
:def presentDebug \e -> return ("let it = " ++ e ++ "\n$(Present.presentIt)")
:def presentQualified \e -> return ("let it = " ++ e ++ "\nPrelude.putStrLn (Present.toShow True $(Present.presentIt))")
:def present \e -> return ("let it = " ++ e ++ "\nPrelude.putStrLn (Present.toShow False $(Present.presentIt))")
:set -package present

Usage

bash-3.2$ stack exec ghci
GHCi, version 7.10.3: http://www.haskell.org/ghc/  :? for help
package flags have changed, resetting and loading new packages...
λ> :present "hi"
"hi"

λ> :present 123
123

λ> :present (5.2,"hi",1,'a')
(5.2,"hi",1,'a')

λ> data X a = X a Int

λ> :present X 5 1
X 5 1

λ> :present S88.pack "hi"
"hi"

λ> :present print
<a_0 -> GHC.Types.IO ()>

λ> :present print ()
IO (<GHC.Prim.State# GHC.Prim.RealWorld -> (GHC.Prim.State# GHC.Prim.RealWorld, a_0)>)

λ> :present undefined
<_ :: t_0>

λ> :present id
<a_0 -> a_0>

λ> :present [undefined]
[<_ :: t_0>]

Extension

You can write your own instances like this:

λ> data X = X Int
λ> :present X 5
X 5
λ> instance Present0 X where present0 = ("X",\(X x) -> IntegerPresentation "X" (show x))
λ> :present X 5
5

Detailed output

λ> :presentDebug (2.5,"hi",1,'a')
TuplePresentation
  "(GHC.Types.Double,GHC.Base.String,GHC.Integer.Type.Integer,GHC.Types.Char)"
  [ChoicePresentation
     "GHC.Types.Double"
     [("Floating",IntegerPresentation "GHC.Types.Double" "2.5")
     ,("Show",IntegerPresentation "GHC.Types.Double" "2.5")
     ,("Rational",IntegerPresentation "GHC.Types.Double" "5/2")
     ,("Internal"
      ,DataTypePresentation "GHC.Types.Double"
                            "GHC.Types.D#"
                            [PrimitivePresentation "GHC.Prim.Double#"])]
  ,ChoicePresentation
     "String"
     [("String",StringPresentation "String" "hi")
     ,("List of characters"
      ,ListPresentation
         "[GHC.Types.Char]"
         [ChoicePresentation
            "GHC.Types.Char"
            [("Character",CharPresentation "GHC.Types.Char" "h")
            ,("Unicode point"
             ,ChoicePresentation
                "GHC.Types.Char"
                [("Decimal",IntegerPresentation "GHC.Types.Char" "104")
                ,("Hexadecimal",IntegerPresentation "GHC.Types.Char" "68")
                ,("Binary",IntegerPresentation "GHC.Types.Char" "1101000")])
            ,("Internal"
             ,DataTypePresentation "GHC.Types.Char"
                                   "GHC.Types.C#"
                                   [PrimitivePresentation "GHC.Prim.Char#"])]
         ,ChoicePresentation
            "GHC.Types.Char"
            [("Character",CharPresentation "GHC.Types.Char" "i")
            ,("Unicode point"
             ,ChoicePresentation
                "GHC.Types.Char"
                [("Decimal",IntegerPresentation "GHC.Types.Char" "105")
                ,("Hexadecimal",IntegerPresentation "GHC.Types.Char" "69")
                ,("Binary",IntegerPresentation "GHC.Types.Char" "1101001")])
            ,("Internal"
             ,DataTypePresentation "GHC.Types.Char"
                                   "GHC.Types.C#"
                                   [PrimitivePresentation "GHC.Prim.Char#"])]])]
  ,ChoicePresentation
     "GHC.Integer.Type.Integer"
     [("Decimal",IntegerPresentation "GHC.Integer.Type.Integer" "1")
     ,("Hexadecimal",IntegerPresentation "GHC.Integer.Type.Integer" "1")
     ,("Binary",IntegerPresentation "GHC.Integer.Type.Integer" "1")
     ,("Internal"
      ,DataTypePresentation "GHC.Integer.Type.Integer"
                            "GHC.Integer.Type.S#"
                            [PrimitivePresentation "GHC.Prim.Int#"])]
  ,ChoicePresentation
     "GHC.Types.Char"
     [("Character",CharPresentation "GHC.Types.Char" "a")
     ,("Unicode point"
      ,ChoicePresentation
         "GHC.Types.Char"
         [("Decimal",IntegerPresentation "GHC.Types.Char" "97")
         ,("Hexadecimal",IntegerPresentation "GHC.Types.Char" "61")
         ,("Binary",IntegerPresentation "GHC.Types.Char" "1100001")])
     ,("Internal"
      ,DataTypePresentation "GHC.Types.Char"
                            "GHC.Types.C#"
                            [PrimitivePresentation "GHC.Prim.Char#"])]]
You can’t perform that action at this time.