1
0
mirror of https://github.com/dhil/phd-dissertation synced 2026-03-13 11:08:25 +00:00

Combining monads

This commit is contained in:
2021-05-23 15:33:28 +01:00
parent 1945a7307c
commit a3273afa50
2 changed files with 49 additions and 24 deletions

View File

@@ -802,6 +802,17 @@
year = {1992} year = {1992}
} }
@inproceedings{KingW92,
author = {David J. King and
Philip Wadler},
title = {Combining Monads},
booktitle = {Functional Programming},
series = {Workshops in Computing},
pages = {134--143},
publisher = {Springer},
year = {1992}
}
@inproceedings{JonesW93, @inproceedings{JonesW93,
author = {Simon L. Peyton Jones and author = {Simon L. Peyton Jones and
Philip Wadler}, Philip Wadler},

View File

@@ -1327,28 +1327,42 @@ The free monad brings us close to the essence of programming with
effect handlers. effect handlers.
\subsection{Back to direct-style} \subsection{Back to direct-style}
\dhil{The problem with monads is that they do not Monads do not freely compose, because monads must satisfy a
compose. Cite~\citet{Espinosa95}, \citet{VazouL16} \citet{McBrideP08}} distributive property in order to combine~\cite{KingW92}. Alas, not
every monad has a distributive property.
% %
The inherent problems with monads is that they break the basic The lack of composition is to an extent remedied by monad
doctrine of modular abstraction, which says we should program against transformers, which provide a programmatic abstraction for stacking
an abstract interface, not an implementation. A monad is a concrete one monad on top of another~\cite{Espinosa95}. The problem with monad
implementation. Monadic effect operations are intimately tied to the transformers is that they enforce an ordering on effects that affects
concrete monad structure. the program semantics (c.f. my MSc dissertation for a concrete example
of this~\cite{Hillerstrom15}).
It is worth mentioning \citeauthor{McBrideP08}'s idioms (known as However, a more fundamental problem with monads is that they break the
applicative functors in Haskell) as an alternative to monadic basic doctrine of modular abstraction, which says we should program
against an abstract interface, not an implementation. Effectful
programming using monads fixates on the concrete structure first, and
adds effect operations second. As a result monadic effect operations
are intimately tied to the concrete structure of their monad.
Before moving onto direct-style alternatives, it is worth mentioning
\citeauthor{McBrideP08}'s idioms (known as applicative functors in
Haskell) as an alternative to monadic
programming~\cite{McBrideP08}. Idioms provide an applicative style for programming~\cite{McBrideP08}. Idioms provide an applicative style for
programming with effects. Even though idioms are computationally programming with effects. Even though idioms are computationally
weaker than monads, they are still capable of simulating a wide range weaker than monads, they are still capable of encapsulating a wide
of computational effects whose realisation do not require the full range of computational effects whose realisation do not require the
monad structure (consult \citet{Yallop10} for a technical analysis of full monad structure (consult \citet{Yallop10} for a technical
idioms and monads). analysis of idioms and monads). Another thing worth pointing out is
that it is possible to have a direct-style interface for effectful
programming in the source language, which the compiler can translate
into monadic binds and returns automatically. For a concrete example
of this see the work of \citet{VazouL16}.
We will wrap up this crash course in effectful programming by looking Let us wrap up this crash course in effectful programming by looking
at two techniques for programming in direct-style with effects that at two approaches for programming in direct-style with effects that
make use of delimited control before finishing with a brief discussion make structured use of delimited control, before finishing with a
of effect tracking. brief discussion of effect tracking.
\subsubsection{Monadic reflection on state} \subsubsection{Monadic reflection on state}
% %
@@ -1605,13 +1619,13 @@ tracking is a useful tool for making programming with effects less
prone to error in much the same way a static type system is useful for prone to error in much the same way a static type system is useful for
detecting a wide range of potential runtime errors at compile time. detecting a wide range of potential runtime errors at compile time.
The principal idea of an effect system is to annotate computation The principal idea of a \citet{LucassenG88} style effect system is to
types with the collection of effects that their inhabitants are annotate computation types with the collection of effects that their
allowed to perform, e.g. the type $A \to B \eff E$ is inhabited by inhabitants are allowed to perform, e.g. the type $A \to B \eff E$ is
functions that accept a value of type $A$ as input and ultimately inhabited by functions that accept a value of type $A$ as input and
return a value of type $B$. As an inhabitant computes the $B$ value it ultimately return a value of type $B$. As an inhabitant computes the
is allowed to perform the effect operations mentioned by the effect $B$ value it is allowed to perform the effect operations mentioned by
signature $E$. the effect signature $E$.
This typing discipline fits nicely with the effect handlers-style of This typing discipline fits nicely with the effect handlers-style of
programming. The $\Do$ construct provides a mechanism for injecting an programming. The $\Do$ construct provides a mechanism for injecting an