Haskell
Last updated
Last updated
:reload
reload all names in scope
:quit
:t 9
returns the type of 9
:info []
returns lots of useful details about the implemented typeclasses
:k Int
returns the kind of Int
:set prompt "\x03BB > "
would change the command prompt to λ >
:set -XExistentialQuantification
sets up the language extension
You can give to GHCi as follows:
The best way to find out about these kind of constructs in ghci, e.g. :info <*>
:
(.)
- Function composition
<*>
$
The following would be read all as (x:xs)
:
Import hiding
Code which is part of some expression should be indented further in than the beginning of that expression...All grouped expressions must be exactly aligned
But you can avoid indentation:
Indentation is actually optional if you instead use semicolons and curly braces
data
means we're declaring a new type
Expr
is the type constructor
I ...
, Add ...
, Mul ...
are the value constructors
You can pattern match against them:
And create new versions with certain fields overwritten using:
newtype
declarationsA set with an associative binary operation. Superset of Monoids.
Integer numbers form a monoid under addition with 0 as identity element Integer numbers form a monoid under multiplication with 1 as identity element Lists form a monoid under concatenation with the empty list as identity element
mappend
is given the infix synonym (<>)
The following language option is required:
And then an example would be:
It is used e.g. by lens
to generate the various lenses into data structures at compile time
allows us to conditionally check a statement within a pattern matching expression.
Define inline bindings (e.g. to functions or values). The uses guards and a where clase:
The 'as' pattern (described , and ), gives us a way of matching a name for the entire element being pattern matched in a list:
from 'Learn you a Haskell' is a good reference.
From , the golden rule of indentation is:
In the following snippet ():
Adding deriving (Show)
at the end of a data declaration automatically makes that type part of the Show typeclass ():
providing data accessors:
For the moment, I treat newtype
as being broadly interchangable with data
when creating a new type. There's documentation about it .
is a typeclass with an associative mappend
operation and an identity element.
The crux of is that the provide a way to explicitly declare the type signature of each constructor.
is similar to Lisp macros.
forall
when defining new data types