@@ -51,7 +51,7 @@ message passing, including TCP/IP, UDP,
51
51
[ MPI] ( http://en.wikipedia.org/wiki/Message_Passing_Interface ) ,
52
52
[ CCI] ( http://www.olcf.ornl.gov/center-projects/common-communication-interface/ ) ,
53
53
[ ZeroMQ] ( http://zeromq.org ) , [ SSH] ( http://openssh.com ) , MVars, Unix pipes, and more. Each of these transports provides
54
- its own implementation of the ` Network.Transport ` and provide a means of creating
54
+ its own implementation of the ` Network.Transport ` API and provide a means of creating
55
55
new connections for use within ` Control.Distributed.Process ` .
56
56
57
57
The following diagram shows dependencies between the various subsystems,
@@ -91,8 +91,8 @@ In this diagram, the various nodes roughly correspond to specific modules:
91
91
Transport Implementation : Network.Transport.*
92
92
93
93
An application is built using the primitives provided by the Cloud
94
- Haskell layer, provided by ` Control.Distributed.Process ` module, which
95
- provides abstractions such as nodes and processes.
94
+ Haskell layer, provided by the ` Control.Distributed.Process ` module, which
95
+ defines abstractions such as nodes and processes.
96
96
97
97
The application also depends on a Cloud Haskell Backend, which
98
98
provides functions to allow the initialisation of the transport layer
@@ -102,7 +102,7 @@ It is, of course, possible to create new Cloud Haskell nodes by
102
102
using a Network Transport Backend such as ` Network.Transport.TCP `
103
103
directly.
104
104
105
- The Cloud Haskell interface and backend, make use of the Transport
105
+ The Cloud Haskell interface and backend make use of the Transport
106
106
interface provided by the ` Network.Transport ` module.
107
107
This also serves as an interface for the ` Network.Transport.* `
108
108
module, which provides a specific implementation for this transport,
@@ -116,7 +116,7 @@ the concurrency and messaging passing capabilities of the *process layer*.
116
116
Cloud Haskell applications are built using the primitives provided by the
117
117
* process layer* (i.e., [ distributed-process] [ distributed-process ] ), which provides abstractions
118
118
such as nodes and processes. Applications must also depend on a Cloud Haskell
119
- Backend , which provides functions to allow the initialisation of the transport
119
+ backend , which provides functions to allow the initialisation of the transport
120
120
layer using whatever topology might be appropriate to the application.
121
121
122
122
` Network.Transport ` is a network abstraction layer geared towards specific
@@ -125,7 +125,7 @@ classes of applications, offering the following high level concepts:
125
125
* Nodes in the network are represented by ` EndPoint ` s. These are heavyweight stateful objects.
126
126
* Each ` EndPoint ` has an ` EndPointAddress ` .
127
127
* Connections can be established from one ` EndPoint ` to another using the ` EndPointAddress ` of the remote end.
128
- * The ` EndPointAddress ` can be serialised and sent over the network, where as ` EndPoint ` s and connections cannot.
128
+ * The ` EndPointAddress ` can be serialised and sent over the network, whereas ` EndPoint ` s and connections cannot.
129
129
* Connections between ` EndPoint ` s are unidirectional and lightweight.
130
130
* Outgoing messages are sent via a ` Connection ` object that represents the sending end of the connection.
131
131
* Incoming messages for ** all** of the incoming connections on an ` EndPoint ` are collected via a shared receive queue.
@@ -328,7 +328,7 @@ Haskell concurrency design patterns along the way.
328
328
329
329
In fact, [ distributed-process-platform] [ distributed-process-platform ] does not really consider the
330
330
* task layer* in great detail. We provide an API comparable to remote's
331
- ` Promise ` in Control.Distributed.Process.Platform.Async. This API however,
331
+ ` Promise ` in ` Control.Distributed.Process.Platform.Async ` . This API however,
332
332
is derived from Simon Marlow's [ Control.Concurrent.Async] [ async ] package, and is not
333
333
limited to blocking queries on ` Async ` handles in the same way. Instead our
334
334
[ API] [ d-p-platform-async ] handles both blocking and non-blocking queries, polling
@@ -376,7 +376,7 @@ around `Async` that disallows side effects is relatively simple, and we
376
376
do not consider the presence of side effects a barrier to fault tolerance
377
377
and automated process restarts. Erlang does not forbid * IO* in its processes,
378
378
and yet that doesn't render supervision trees ineffective. They key is to
379
- provide a rich enough API that statefull processes can recognise whether or
379
+ provide a rich enough API that stateful processes can recognise whether or
380
380
not they need to provide idempotent initialisation routines.
381
381
382
382
The utility of preventing side effects using the type system is, however, not
0 commit comments