Skip to content

Commit e7a0118

Browse files
committed
Replace link numbers with symbolic names.
This is more maintainable since easier to detect dead or confused links through inspection.
1 parent cfda100 commit e7a0118

File tree

1 file changed

+49
-53
lines changed

1 file changed

+49
-53
lines changed

documentation.md

Lines changed: 49 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@ title: Documentation
55

66
### Cloud Haskell Platform
77

8-
This is the [*Cloud Haskell Platform*][1]. Cloud Haskell is a set of libraries
8+
This is the [*Cloud Haskell Platform*][cloud-haskell]. Cloud Haskell is a set of libraries
99
that bring Erlang-style concurrency and distribution to Haskell programs. This
1010
project is an implementation of that distributed computing interface, where
1111
processes communicate with one another through explicit message passing rather
1212
than shared memory.
1313

14-
Originally described by the joint [Towards Haskell in the Cloud][12] paper,
14+
Originally described by the joint [Towards Haskell in the Cloud][haskell11-ch] paper,
1515
Cloud Haskell has be re-written from the ground up and supports a rich and
1616
growing number of features for
1717

@@ -23,23 +23,23 @@ growing number of features for
2323
* supporting *static* values (required for remote communication)
2424

2525
There is a recent
26-
[presentation](http://sneezy.cs.nott.ac.uk/fun/2012-02/coutts-2012-02-28.pdf)
26+
[presentation][fun201202-coutts]
2727
on Cloud Haskell and this reimplementation, which is worth reading in conjunction
2828
with the documentation and wiki pages on this website..
2929

3030
Cloud Haskell comprises the following components, some of which are complete,
3131
others experimental.
3232

33-
* [distributed-process][2]: Base concurrency and distribution support
34-
* [distributed-process-platform][3]: The Cloud Haskell Platform - APIs
35-
* [distributed-static][4]: Support for static values
36-
* [rank1dynamic][5]: Like `Data.Dynamic` and `Data.Typeable` but supporting polymorphic values
37-
* [network-transport][6]: Generic `Network.Transport` API
38-
* [network-transport-tcp][7]: TCP realisation of `Network.Transport`
39-
* [network-transport-inmemory][8]: In-memory realisation of `Network.Transport` (incomplete)
40-
* [network-transport-composed][9]: Compose two transports (very preliminary)
41-
* [distributed-process-simplelocalnet][10]: Simple backend for local networks
42-
* [distributed-process-azure][11]: Azure backend for Cloud Haskell (proof of concept)
33+
* [distributed-process][distributed-process]: Base concurrency and distribution support
34+
* [distributed-process-platform][distributed-process-platform]: The Cloud Haskell Platform - APIs
35+
* [distributed-static][distributed-static]: Support for static values
36+
* [rank1dynamic][rank1dynamic]: Like `Data.Dynamic` and `Data.Typeable` but supporting polymorphic values
37+
* [network-transport][network-transport]: Generic `Network.Transport` API
38+
* [network-transport-tcp][network-transport-tcp]: TCP realisation of `Network.Transport`
39+
* [network-transport-inmemory][network-transport-inmemory]: In-memory realisation of `Network.Transport` (incomplete)
40+
* [network-transport-composed][network-transport-composed]: Compose two transports (very preliminary)
41+
* [distributed-process-simplelocalnet][distributed-process-simplelocalnet]: Simple backend for local networks
42+
* [distributed-process-azure][distributed-process-azure]: Azure backend for Cloud Haskell (proof of concept)
4343

4444
One of Cloud Haskell's goals is to separate the transport layer from the
4545
*process layer*, so that the transport backend is entirely independent:
@@ -114,10 +114,10 @@ Haskell or C.
114114

115115
### Network Transport Abstraction Layer
116116

117-
Cloud Haskell's generic [network-transport][6] API is entirely independent of
117+
Cloud Haskell's generic [network-transport][network-transport] API is entirely independent of
118118
the concurrency and messaging passing capabilities of the *process layer*.
119119
Cloud Haskell applications are built using the primitives provided by the
120-
*process layer* (i.e., [distributed-process][2]), which provides abstractions
120+
*process layer* (i.e., [distributed-process][distributed-process]), which provides abstractions
121121
such as nodes and processes. Applications must also depend on a Cloud Haskell
122122
Backend, which provides functions to allow the initialisation of the transport
123123
layer using whatever topology might be appropriate to the application.
@@ -160,7 +160,7 @@ of other `Network.Transport` APIs if required, but for the most part this
160160
is irrelevant and the application will interact with Cloud Haskell through
161161
the *Process Layer* and *Platform*.
162162

163-
For more details about `Network.Transport` please see the [wiki page][20].
163+
For more details about `Network.Transport` please see the [wiki page](/wiki/networktransport.html).
164164

165165
### Concurrency and Distribution
166166

@@ -169,7 +169,7 @@ distributed programming are exposed to application developers. This layer
169169
deals explicitly with
170170

171171
The core of Cloud Haskell's concurrency and distribution support resides in the
172-
[distributed-process][2] library. As well as the APIs necessary for starting
172+
[distributed-process][distributed-process] library. As well as the APIs necessary for starting
173173
nodes and forking processes on them, we find all the basic primitives required
174174
to
175175

@@ -215,7 +215,7 @@ runProcess :: LocalNode -> Process () -> IO ()
215215
{% endhighlight %}
216216

217217
Once we've spawned some processes, they can communicate with one another
218-
using the messaging primitives provided by [distributed-processes][2],
218+
using the messaging primitives provided by [distributed-processes][distributed-processes],
219219
which are well documented in the haddocks.
220220

221221
### What is Serializable
@@ -272,7 +272,7 @@ need to spawn a process and send a bunch a messages to it, then wait for
272272
replies however; we can’t send a `ReceivePort` since it is not `Serializable`.
273273

274274
`ReceivePort`s can be merged, so we can listen on several simultaneously. In the
275-
latest version of [distributed-process][2], we can listen for *regular* messages
275+
latest version of [distributed-process][distributed-process], we can listen for *regular* messages
276276
and multiple channels at the same time, using `matchChan` in the list of
277277
allowed matches passed `receiveWait` and `receiveTimeout`.
278278

@@ -313,7 +313,7 @@ and decide whether to oblige or not.
313313

314314
### Rethinking the Task Layer
315315

316-
[Towards Haskell in the Cloud][12] describes a multi-layered architecture, in
316+
[Towards Haskell in the Cloud][haskell11-ch] describes a multi-layered architecture, in
317317
which manipulation of concurrent processes and message passing between them
318318
is managed in the *process layer*, whilst a higher level API described as the
319319
*task layer* provides additional features such as
@@ -322,19 +322,19 @@ is managed in the *process layer*, whilst a higher level API described as the
322322
* data centric processing model
323323
* a promise (or *future*) abstraction, representing the result of a calculation that may or may not have yet completed
324324

325-
The [distributed-process-platform][18] library implements parts of the
325+
The [distributed-process-platform][distributed-process-platform] library implements parts of the
326326
*task layer*, but takes a very different approach to that described
327-
in the original paper and implemented by the [remote][14] package. In particular,
327+
in the original paper and implemented by the [remote][remote] package. In particular,
328328
we diverge from the original design and defer to many of the principles
329-
defined by Erlang's [Open Telecom Platform][13], taking in some well established
329+
defined by Erlang's [Open Telecom Platform][OTP], taking in some well established
330330
Haskell concurrency design patterns along the way.
331331

332-
In fact, [distributed-process-platform][18] does not really consider the
332+
In fact, [distributed-process-platform][distributed-process-platform] does not really consider the
333333
*task layer* in great detail. We provide an API comparable to remote's
334334
`Promise` in Control.Distributed.Process.Platform.Async. This API however,
335-
is derived from Simon Marlow's [Control.Concurrent.Async][19] package, and is not
335+
is derived from Simon Marlow's [Control.Concurrent.Async][async] package, and is not
336336
limited to blocking queries on `Async` handles in the same way. Instead our
337-
[API][17] handles both blocking and non-blocking queries, polling
337+
[API][d-p-platform-async] handles both blocking and non-blocking queries, polling
338338
and working with lists of `Async` handles. We also eschew throwing exceptions
339339
to indicate asynchronous task failures, instead handling *task* and connectivity
340340
failures using monitors. Users of the API need only concern themselves with the
@@ -391,7 +391,7 @@ Work is also underway to provide abstractions for managing asynchronous tasks
391391
at a higher level, focussing on workload distribution and load regulation.
392392

393393
The kinds of task that can be performed by the async implementations in
394-
[distributed-process-platform][3] are limited only by their return type:
394+
[distributed-process-platform][distributed-process-platform] are limited only by their return type:
395395
it **must** be `Serializable` - that much should've been obvious by now.
396396
The type of asynchronous task definitions comes in two flavours, one for
397397
local nodes which require no remote-table or static serialisation dictionary,
@@ -430,14 +430,14 @@ domain was more *haskell-ish* than working with bare send and receive primitives
430430
The `Async` sub-package also provides a type safe interface for receiving data,
431431
although it is limited to running a computation and waiting for its result.
432432

433-
The [Control.Distributed.Processes.Platform.ManagedProcess][21] API provides a
433+
The [Control.Distributed.Processes.Platform.ManagedProcess][d-p-platform-ManagedProcess] API provides a
434434
number of different abstractions that can be used to achieve similar benefits
435435
in your code. It works by introducing a standard protocol between your process
436436
and the *world outside*, which governs how to handle request/reply processing,
437437
exit signals, timeouts, sleeping/hibernation with `threadDelay` and even provides
438438
hooks that terminating processes can use to clean up residual state.
439439

440-
The [API documentation][21] is quite extensive, so here we will simply point
440+
The [API documentation][d-p-platform-ManagedProcess] is quite extensive, so here we will simply point
441441
out the obvious differences. A process implemented with `ManagedProcess`
442442
can present a type safe API to its callers (and the server side code too!),
443443
although that's not its primary benefit. For a very simplified example:
@@ -489,8 +489,8 @@ API, which looks a lot like `Async` but manages exit signals in a single thread
489489
configurable task pools and task supervision strategy part of its API.
490490

491491
More complex examples of the `ManagedProcess` API can be seen in the
492-
[Managed Processes tutorial][22]. API documentation for HEAD is available
493-
[here][21].
492+
[Managed Processes tutorial](tutorials/tutorial3.html). API documentation for HEAD is available
493+
[here][d-p-platform-ManagedProcess].
494494

495495
### Supervision Trees
496496

@@ -500,25 +500,21 @@ TBC
500500

501501
TBC
502502

503-
[1]: http://haskell-distributed.github.io/documentation.html
504-
[2]: https://github.com/haskell-distributed/distributed-process
505-
[3]: https://github.com/haskell-distributed/distributed-process-platform
506-
[4]: http://hackage.haskell.org/package/distributed-static
507-
[5]: http://hackage.haskell.org/package/rank1dynamic
508-
[6]: http://hackage.haskell.org/package/network-transport
509-
[7]: http://hackage.haskell.org/package/network-transport-tcp
510-
[8]: https://github.com/haskell-distributed/network-transport-inmemory
511-
[9]: https://github.com/haskell-distributed/network-transport-composed
512-
[10]: http://hackage.haskell.org/package/distributed-process-simplelocalnet
513-
[11]: http://hackage.haskell.org/package/distributed-process-azure
514-
[12]: http://research.microsoft.com/en-us/um/people/simonpj/papers/parallel/remote.pdf
515-
[13]: http://en.wikipedia.org/wiki/Open_Telecom_Platform
516-
[14]: http://hackage.haskell.org/package/remote
517-
[15]: http://www.erlang.org/doc/design_principles/sup_princ.html
518-
[16]: http://www.erlang.org/doc/man/supervisor.html
519-
[17]: http://hackage.haskell.org/package/distributed-process-platform/Control-Distributed-Process-Platform-Async.html
520-
[18]: https://github.com/haskell-distributed/distributed-process-platform
521-
[19]: http://hackage.haskell.org/package/async
522-
[20]: /wiki/networktransport.html
523-
[21]: http://hackage.haskell.org/package/distributed-process-platform/Control-Distributed-Process-Platform-ManagedProcess.html
524-
[22]: /tutorials/tutorial3.html
503+
[cloud-haskell]: http://haskell-distributed.github.io/documentation.html
504+
[fun201202-coutts]: http://sneezy.cs.nott.ac.uk/fun/2012-02/coutts-2012-02-28.pdf
505+
[distributed-process]: https://github.com/haskell-distributed/distributed-process
506+
[distributed-process-platform]: https://github.com/haskell-distributed/distributed-process-platform
507+
[distributed-static]: http://hackage.haskell.org/package/distributed-static
508+
[rank1dynamic]: http://hackage.haskell.org/package/rank1dynamic
509+
[network-transport]: http://hackage.haskell.org/package/network-transport
510+
[network-transport-tcp]: http://hackage.haskell.org/package/network-transport-tcp
511+
[network-transport-inmemory]: https://github.com/haskell-distributed/network-transport-inmemory
512+
[network-transport-composed]: https://github.com/haskell-distributed/network-transport-composed
513+
[distributed-process-simplelocalnet]: http://hackage.haskell.org/package/distributed-process-simplelocalnet
514+
[distributed-process-azure]: http://hackage.haskell.org/package/distributed-process-azure
515+
[haskell11-ch]: http://research.microsoft.com/en-us/um/people/simonpj/papers/parallel/remote.pdf
516+
[OTP]: http://en.wikipedia.org/wiki/Open_Telecom_Platform
517+
[remote]: http://hackage.haskell.org/package/remote
518+
[d-p-platform-async]: http://hackage.haskell.org/package/distributed-process-platform/Control-Distributed-Process-Platform-Async.html
519+
[async]: http://hackage.haskell.org/package/async
520+
[d-p-platform-ManagedProcess]: http://hackage.haskell.org/package/distributed-process-platform/Control-Distributed-Process-Platform-ManagedProcess.html

0 commit comments

Comments
 (0)