Difference between revisions of "Keywords"
DonStewart (talk | contribs) (Entry for ~) |
DonStewart (talk | contribs) (as keyword) |
||
Line 104: | Line 104: | ||
== as == |
== as == |
||
+ | <haskell> |
||
− | Please write this |
||
+ | import qualfified Data.Map as M |
||
+ | |||
+ | main = print (M.empty :: M.Map Int ()) |
||
+ | </haskell> |
||
== case, of == |
== case, of == |
Revision as of 07:47, 10 September 2006
This page lists all Haskell keywords, feel free to edit. Hoogle searches will return results from this page. Please respect the Anchor macros.
For additional information you might want to look at the Haskell 98 report.
|
safeTail x | null x = [] | otherwise = tail x
squares = [a*a | a <- [1..]]
->
The function type constructor:
length :: [a] -> Int
In lambdas:
\x -> x + 1
In case statements:
case Just 3 of
Nothing -> False
Just x -> True
And on the kind level:
(->) :: ?? -> ? -> *
<-
In do-notation:
do x <- getChar
putChar x
In list comprehension generators:
[ (x,y) | x <- [1..10], y <- ['a'..'z'] ]
@
Patterns of the form var@pat are called as-patterns, and allow one to use var as a name for the value being matched by pat. For example:
case e of { xs@(x:rest) -> if x==0 then rest else xs }
is equivalent to:
let { xs = e } in case xs of { (x:rest) -> if x==0 then rest else xs }
!
Whenever a data constructor is applied, each argument to the constructor is evaluated if and only if the corresponding type in the algebraic datatype declaration has a strictness flag, denoted by an exclamation point. For example:
data STList a = STCons a !(STList a) -- the second argument to STCons will be -- evaluated before STCons is applied | STNil
to illustrate the difference between strict versus lazy constructor application, consider the following:
stList = STCons 1 undefined lzList = (:) 1 undefined stHead (STCons h _) = h -- this evaluates to undefined when applied to stList lzHead (h : _) = h -- this evaluates to 1 when applied to lzList
::
"type of"
length :: [a] -> Int
_
Patterns of the form _ are wildcards and are useful when some part of a pattern is not referenced on the right-hand-side. It is as if an identifier not used elsewhere were put in its place. For example,
case e of { [x,_,_] -> if x==0 then True else False }
is equivalent to:
case e of { [x,y,z] -> if x==0 then True else False }
~
Lazy pattern bindings. Matching the pattern ~pat against a value always suceeds, and matching will only diverge when one of the variables bound in the pattern is used.
(f *** g) ~(x,y) = (f x, g y)
as
import qualfified Data.Map as M
main = print (M.empty :: M.Map Int ())
case, of
A case expression has the general form
case e of { p1 match1 ; ... ; pn matchn }
where each match is of the general form
| g1 -> e1 ... | gm -> em where decls
Each alternative consists of a pattern pi and its matches, matchi. Each match in turn consists of a sequence of pairs of guards gj and bodies ej (expressions), followed by optional bindings (decls) that scope over all of the guards and expressions of the alternative. An alternative of the form
pat -> exp where decls
is treated as shorthand for:
pat | True -> exp where decls
A case expression must have at least one alternative and each alternative must have at least one body. Each body must have the same type, and the type of the whole expression is that type.
A case expression is evaluated by pattern matching the expression e against the individual alternatives. The alternatives are tried sequentially, from top to bottom. If e matches the pattern in the alternative, the guards for that alternative are tried sequentially from top to bottom, in the environment of the case expression extended first by the bindings created during the matching of the pattern, and then by the declsi in the where clause associated with that alternative. If one of the guards evaluates to True, the corresponding right-hand side is evaluated in the same environment as the guard. If all the guards evaluate to False, matching continues with the next alternative. If no match succeeds, the result is _|_.
class
Please write this
data
The data
declaration is how one introduces new algebraic data types into Haskell. As an example, to create a datatype to hold an Abstract syntax tree for an expression, one could use:
data Exp = Ebin Operator Exp Exp | Eunary Operator Exp | Efun FunctionIdentifier [Exp] | Eid SimpleIdentifier
where the types Operator, FunctionIdentifier
and SimpleIdentifier
are defined elsewhere.
See the page on types for more information, links and examples.
default
Please write this
deriving
Please write this
do
Syntactic sugar for use with monadic expressions. For example:
do { x ; result <- y ; foo result }
is shorthand for:
x >> y >>= \result -> foo result
forall
This is a GHC/Hugs extension, and as such is not portable Haskell 98.
hiding
Please write this
if, then, else
A conditional expression has the form:
if e1 then e2 else e3
...and returns the value of e2 if the value of e1 is True, e3 if e1 is False, and _|_ otherwise.
max a b = if a > b then a else b
import
Please write this
infix, infixl, infixr
Please write this
instance
Please write this
let, in
Let expressions have the general form:
let { d1 ; ... ; dn } in e
They introduce a nested, lexically-scoped, mutually-recursive list of declarations (let is often called letrec in other languages). The scope of the declarations is the expression e and the right hand side of the declarations.
module
taken from: http://www.haskell.org/tutorial/modules.html
Technically speaking, a module is really just one big declaration which begins with the keyword module; here's an example for a module whose name is Tree:
module Tree ( Tree(Leaf,Branch), fringe ) where
data Tree a = Leaf a | Branch (Tree a) (Tree a)
fringe :: Tree a -> [a] fringe (Leaf x) = [x] fringe (Branch left right) = fringe left ++ fringe right
newtype
The newtype
declaration is how one introduces a renaming for an algebraic data type into Haskell. This is different from type
below, as a newtype
requires a new constructor as well. As an example, when writing a compiler
one sometimes further qualifies Identifier
s to assist in type safety checks:
newtype SimpleIdentifier = SimpleIdentifier Identifier newtype FunctionIdentifier = FunctionIdentifier Identifier
Most often, one supplies smart constructors and destructors for these to ease working with them.
See the page on types for more information, links and examples.
qualified
Please write this
type
The type
declaration is how one introduces an alias for an algebraic data type into Haskell. As an example, when writing a compiler
one often creates an alias for identifiers:
type Identifier = String
This allows you to use Identifer
wherever you had used String
and if something is of type Identifier
it
may be used wherever a String
is expected.
See the page on types for more information, links and examples.
where
Please write this