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#"])]]