Mercurial > urweb
comparison doc/manual.tex @ 2009:799be3911ce3
Monadic bind supports patterns
author | Adam Chlipala <adam@chlipala.net> |
---|---|
date | Fri, 02 May 2014 17:16:02 -0400 |
parents | 93ff76058825 |
children | 403f0cc65b9c |
comparison
equal
deleted
inserted
replaced
2008:93ff76058825 | 2009:799be3911ce3 |
---|---|
1440 \hspace{.1in} \to \mt{monad} \; \mt{m} | 1440 \hspace{.1in} \to \mt{monad} \; \mt{m} |
1441 \end{array}$$ | 1441 \end{array}$$ |
1442 | 1442 |
1443 The Ur/Web compiler provides syntactic sugar for monads, similar to Haskell's \cd{do} notation. An expression $x \leftarrow e_1; e_2$ is desugared to $\mt{bind} \; e_1 \; (\lambda x \Rightarrow e_2)$, and an expression $e_1; e_2$ is desugared to $\mt{bind} \; e_1 \; (\lambda () \Rightarrow e_2)$. Note a difference from Haskell: as the $e_1; e_2$ case desugaring involves a function with $()$ as its formal argument, the type of $e_1$ must be of the form $m \; \{\}$, rather than some arbitrary $m \; t$. | 1443 The Ur/Web compiler provides syntactic sugar for monads, similar to Haskell's \cd{do} notation. An expression $x \leftarrow e_1; e_2$ is desugared to $\mt{bind} \; e_1 \; (\lambda x \Rightarrow e_2)$, and an expression $e_1; e_2$ is desugared to $\mt{bind} \; e_1 \; (\lambda () \Rightarrow e_2)$. Note a difference from Haskell: as the $e_1; e_2$ case desugaring involves a function with $()$ as its formal argument, the type of $e_1$ must be of the form $m \; \{\}$, rather than some arbitrary $m \; t$. |
1444 | 1444 |
1445 The syntactic sugar also allows $p \leftarrow e_1; e_2$ for $p$ a pattern. The pattern should be guaranteed to match any value of the corresponding type, or there will be a compile-time error. | |
1446 | |
1445 \subsection{Transactions} | 1447 \subsection{Transactions} |
1446 | 1448 |
1447 Ur is a pure language; we use Haskell's trick to support controlled side effects. The standard library defines a monad $\mt{transaction}$, meant to stand for actions that may be undone cleanly. By design, no other kinds of actions are supported. | 1449 Ur is a pure language; we use Haskell's trick to support controlled side effects. The standard library defines a monad $\mt{transaction}$, meant to stand for actions that may be undone cleanly. By design, no other kinds of actions are supported. |
1448 $$\begin{array}{l} | 1450 $$\begin{array}{l} |
1449 \mt{con} \; \mt{transaction} :: \mt{Type} \to \mt{Type} \\ | 1451 \mt{con} \; \mt{transaction} :: \mt{Type} \to \mt{Type} \\ |