Safe Haskell | None |
---|---|
Language | Haskell2010 |
Serializable closures for distributed programming.
- type Serializable a = (Binary a, Typeable a)
- data Closure a
- closure :: StaticPtr a -> Closure a
- unclosure :: Closure a -> a
- cpure :: Closure (Dict (Serializable a)) -> a -> Closure a
- cap :: Typeable a => Closure (a -> b) -> Closure a -> Closure b
- cmap :: Typeable a => StaticPtr (a -> b) -> Closure a -> Closure b
- data Dict a :: Constraint -> * where
Documentation
type Serializable a = (Binary a, Typeable a) Source
Values that can be sent across the network.
Closures
Type of serializable closures. Abstractly speaking, a closure is a code
reference paired together with an environment. A serializable closure
includes a shareable code reference (i.e. a StaticPtr
). Closures can be
serialized only if all expressions captured in the environment are
serializable.
closure :: StaticPtr a -> Closure a Source
Lift a Static pointer to a closure with an empty environment.
cpure :: Closure (Dict (Serializable a)) -> a -> Closure a Source
A closure can be created from any serializable value. cpure
corresponds
to Control.Applicative's pure
, but restricted to
lifting serializable values only.
cap :: Typeable a => Closure (a -> b) -> Closure a -> Closure b Source
Closure application. Note that Closure
is not a functor, let alone an
applicative functor, even if it too has a meaningful notion of application.
Closure dictionaries
A Dict
reifies a constraint in the form of a first class value. The Dict
type is not serializable: how do you serialize the constraint that values of
this type carry? However, for any constraint c
, a value of type
can be serialized and sent over the wire, just like any
Closure
(Dict
c)Closure
. A serializable dictionary for some constraint c
is a value of
type
.Closure
(Dict
c)
data Dict a :: Constraint -> * where
Values of type
capture a dictionary for a constraint of type Dict
pp
.
e.g.
Dict
::Dict
(Eq
Int
)
captures a dictionary that proves we have an:
instance Eq
'Int
Pattern matching on the Dict
constructor will bring this instance into scope.
a :=> (Read (Dict a)) | |
a :=> (Monoid (Dict a)) | |
a :=> (Enum (Dict a)) | |
a :=> (Bounded (Dict a)) | |
() :=> (Eq (Dict a)) | |
() :=> (Ord (Dict a)) | |
() :=> (Show (Dict a)) | |
a => Bounded (Dict a) | |
a => Enum (Dict a) | |
Eq (Dict a) | |
(Typeable Constraint p, p) => Data (Dict p) | |
Ord (Dict a) | |
a => Read (Dict a) | |
Show (Dict a) | |
a => Monoid (Dict a) |