|
Control.Concurrent.FullSession |
|
|
|
|
Description |
Pi-calculus style communication and concurrency primitives which come with session types.
|
|
Synopsis |
|
data Z | | data S n | | data P n | | class Nat n | | data T | | data F | | data Send v u | | data Recv v u | | data Throw u' u | | data Catch u' u | | data Select u1 u2 | | data Offer u1 u2 | | data End | | data Bot | | data Rec m r | | data Var n | | data Close | | data SelectN u1 u2 | | data OfferN u1 u2 | | data ss :> s | | data Nil | | data Session t ss tt a | | (>>>=) :: Session t ss tt a -> (a -> Session t tt uu b) -> Session t ss uu b | | (>>>) :: Session t ss tt a -> Session t tt uu b -> Session t ss uu b | | ireturn :: a -> Session t ss ss a | | runS :: Ended n ss => forall a n. (forall t. Session t Nil ss a) -> IO a | | data Channel t n | | data Service u | | close :: (Pickup ss n Close, Update ss n End ss', IsEnded ss F) => Channel t n -> Session t ss ss' () | | send :: (Pickup ss n (Send v a), Update ss n a ss', IsEnded ss F) => Channel t n -> v -> Session t ss ss' () | | recv :: (Pickup ss n (Recv v u), Update ss n u ss', IsEnded ss F) => Channel t n -> Session t ss ss' v | | sendS :: (Pickup ss n1 (Throw c1 u1), Update ss n1 u1 ss', Pickup ss' n2 c1, Update ss' n2 End ss'', IsEnded ss F) => Channel t n1 -> Channel t n2 -> Session t ss ss'' () | | recvS :: (Pickup ss n1 (Catch c1 u1), Update ss n1 u1 ss', SList ss' l, IsEnded ss F) => Channel t n1 -> Session t ss (ss' :> c1) (Channel t l) | | sel1 :: (Pickup ss n (Select s x), Update ss n s tt, IsEnded ss F) => Channel t n -> Session t ss tt () | | sel2 :: (Pickup ss n (Select x s), Update ss n s tt, IsEnded ss F) => Channel t n -> Session t ss tt () | | ifSelect :: (Pickup ss n (Select x y), Update ss n x sx, Update ss n y sy, Diff xx yy zz, IsEnded ss F) => Channel t n -> Bool -> Session t sx xx a -> Session t sy yy a -> Session t ss zz a | | offer :: (Pickup ss n (Offer x y), Update ss n x sx, Update ss n y sy, Diff xx yy zz, IsEnded ss F) => Channel t n -> Session t sx xx a -> Session t sy yy a -> Session t ss zz a | | new :: SList ss l => Session t ss (ss :> Bot) (Channel t l) | | newService :: Dual Z u u' => IO (Service u) | | connect :: (Dual Z u u', SList ss l) => Service u -> Session t ss (ss :> u') (Channel t l) | | connectRunS :: (Dual Z u u', Ended xs n) => Service u -> (forall t. Channel t Z -> Session t (Nil :> u') xs a) -> IO a | | accept :: (Dual Z u u', SList ss l) => Service u -> Session t ss (ss :> u) (Channel t l) | | acceptRunS :: (Dual Z u u', Ended xs n) => Service u -> (forall t. Channel t Z -> Session t (Nil :> u) xs a) -> IO a | | connectNw :: (SList ss l, NwSession u) => NwService u -> Session t ss (ss :> u) (Channel t l) | | connectNw2 :: (SList ss l, NwSendOnly u, NwReceiveOnly u') => NwService2 u u' -> Session t ss ((ss :> u) :> u') (Channel t l, Channel t (S l)) | | acceptOneNw2 :: (SList ss l, NwSendOnly u, NwReceiveOnly u') => NwService2 u u' -> Session t ss ((ss :> u) :> u') (Channel t l, Channel t (S l)) | | sel1N :: (Pickup ss n (SelectN s x), Update ss n s tt) => Channel t n -> Session t ss tt () | | sel2N :: (Pickup ss n (SelectN x s), Update ss n s tt) => Channel t n -> Session t ss tt () | | ifSelectN :: (Pickup ss n (SelectN x y), Update ss n x sx, Update ss n y sy, Diff xx yy zz, IsEnded ss F) => Channel t n -> Bool -> Session t sx xx a -> Session t sy yy a -> Session t ss zz a | | offerN :: (NwReceiver x, NwReceiver y, Pickup ss n (OfferN x y), Update ss n x sx, Update ss n y sy, Diff xx yy zz, IsEnded ss F) => Channel t n -> Session t sx xx a -> Session t sy yy a -> Session t ss zz a | | dualNw :: NwDual u u' => NwService u -> NwService u' | | dualNw2 :: (NwDual u1 u1', NwDual u2 u2') => NwService2 u1 u2 -> NwService2 u1' u2' | | mkNwService :: NwSession u => String -> Int -> u -> NwService u | | mkNwService2 :: (NwSendOnly u, NwReceiveOnly u') => String -> Int -> u -> u' -> NwService2 u u' | | class Message mes where | | | forkIOs :: (SList ss l, SList tt' l, SList tt l, Ended l' ss', IsEnded ss b, Par' b ss tt' tt) => Session t ss ss' () -> Session t tt tt' ThreadId | | forkOSs :: (SList ss l, SList tt' l, SList tt l, Ended l' ss', IsEnded ss b, Par' b ss tt' tt) => Session t ss ss' () -> Session t tt tt' ThreadId | | io :: IO a -> Session t ss ss a | | io_ :: IO a -> Session t ss ss () | | finallys :: Session t ss tt () -> IO () -> Session t ss tt () | | unwind0 :: (RecFold Z u r r, RecUnfold Z r r u, Pickup ss n (Rec Z r), Update ss n u tt, IsEnded ss F) => Channel t n -> Session t ss tt () | | unwind1 :: (RecFold (S Z) u r r, RecUnfold (S Z) r r u, Pickup ss n (Rec (S Z) r), Update ss n u tt, IsEnded ss F) => Channel t n -> Session t ss tt () | | unwind2 :: (RecFold (S (S Z)) u r r, RecUnfold (S (S Z)) r r u, Pickup ss n (Rec (S (S Z)) r), Update ss n u tt, IsEnded ss F) => Channel t n -> Session t ss tt () | | recur1 :: (EndedWithout n s ss, AppendEnd ss ss', SList ss' l, Ended l tt) => (Channel t n -> Session t ss tt ()) -> Channel t n -> Session t ss' tt () | | recur2 :: (EndedWithout2 n m s s' ss, AppendEnd ss ss', SList ss' l, Ended l tt) => (Channel t n -> Channel t m -> Session t ss tt ()) -> Channel t n -> Channel t m -> Session t ss' tt () | | typecheck1 :: SList ss l => (Channel t l -> Session t (ss :> s) ss' a) -> Session t (ss :> s) ss' a | | typecheck2 :: SList ss l => (Channel t (S l) -> Channel t l -> Session t ((ss :> s1) :> s2) ss' a) -> Session t ((ss :> s1) :> s2) ss' a | | class EqNat x y b | x y -> b | | class Sub n n' | | type family SubT n n' :: * | | class SList ss l | ss -> l | | class Pickup ss n s | ss n -> s | | class PickupR ss n s | ss n -> s | | class Update ss n t ss' | ss n t -> ss' | | class UpdateR ss n t ss' | ss n t -> ss' | | class (SList ss n, IsEnded ss T) => Ended n ss | n -> ss | | class IsEnded ss b | ss -> b | | class Dual n s t | s -> t, t -> s | | class Comp s t u | s u -> t, t u -> s, s t -> u | | class Par ss tt' tt | ss tt' -> tt, ss tt -> tt', tt tt' -> ss | | class Par' t ss tt' tt | t ss tt' -> tt, t ss tt -> tt', t tt tt' -> ss | | class EndedWithout n s ss | n s -> ss | | class EndedWithout' n s l ss | n s l -> ss | | class EndedWithout2 n m s t ss | n s m t -> ss | | class EndedWithout2' n m s t l ss | n m s t l -> ss | | class AppendEnd ss ss' | | class AppendEnd' n ss ss' | n ss -> ss', n ss' -> ss | | class Diff xx yy zz | xx yy -> zz | | class Diff' n xx yy zz | n xx yy -> zz | | data NwService u | | data NwService2 u u' | | class NwSession u => NwSender u | | class NwSession u => NwReceiver u | | class NwSession u | | class (NwSession s, NwSession t) => NwDual s t | s -> t, t -> s | | class NwSession u => NwSendOnly u | | class NwSession u => NwReceiveOnly u | | class RecFold m u s r | m u -> r | | class RecFoldCont b m n a s r | b m n a -> r | | class RecFold2 m u r | m u -> r | | class RecFoldCont2 b m n a r | b m n a -> r | | class RecUnfold m r s u | m r s -> u | | class RecUnfoldCont b m n s a | b m n s -> a | | class TypeEq' () x y b => TypeEq x y b | x y -> b | | class TypeEq' q x y b | q x y -> b | | class TypeEq'' q x y b | q x y -> b |
|
|
|
Type level construcs
|
|
Type level numbers and booleans
|
|
|
Type level zero.
| Instances | |
|
|
|
Type level successor. S n denotes (n+1).
| Instances | Sub n (S (S (S (S (S (S (S (S (S n))))))))) | Sub n (S (S (S (S (S (S (S (S n)))))))) | Sub n (S (S (S (S (S (S (S n))))))) | Sub n (S (S (S (S (S (S n)))))) | Sub n (S (S (S (S (S n))))) | Sub n (S (S (S (S n)))) | Sub n (S (S (S n))) | Sub n (S (S n)) | Sub n (S n) | (ss ~ :> ss' s', PickupR ss' n t) => PickupR ss (S n) t | EqNat Z (S n) F | (ss ~ :> ss' s, l ~ S l', EndedWithout' m t l' ss') => EndedWithout2' Z (S m) s t l ss | Show n => Show (S n) | Nat n => Nat (S n) | Sub (S n) n | Sub (S (S n)) n | Sub (S (S (S n))) n | Sub (S (S (S (S n)))) n | Sub (S (S (S (S (S n))))) n | Sub (S (S (S (S (S (S n)))))) n | Sub (S (S (S (S (S (S (S n))))))) n | Sub (S (S (S (S (S (S (S (S n)))))))) n | Sub (S (S (S (S (S (S (S (S (S n))))))))) n | EqNat (S n) Z F | (ss' ~ :> ss'' End, AppendEnd' n ss ss'') => AppendEnd' (S n) ss ss' | (xx ~ :> xx' End, zz ~ :> zz' End, Diff' n xx' yy zz') => Diff' (S n) xx yy zz | (ss ~ :> ss' End, l ~ S l', EndedWithout' n s l' ss') => EndedWithout' (S n) s l ss | (ss ~ :> ss' t, l ~ S l', EndedWithout' n s l' ss') => EndedWithout2' (S n) Z s t l ss | EqNat n n' b => EqNat (S n) (S n') b | (ss ~ :> ss' End, l ~ S l', EndedWithout2' n m s t l' ss') => EndedWithout2' (S n) (S m) s t l ss | Ended n ss => Ended (S n) (:> ss End) | SList ss l => SList (:> ss s) (S l) | UpdateR ss n t ss' => UpdateR (:> ss s) (S n) t (:> ss' s) |
|
|
|
|
Type level predecessor (only for internal use). P n denotes (n-1).
| Instances | |
|
|
|
The class which covers type-level natural numbers.
| | Instances | |
|
|
|
Type level True.
| Instances | |
|
|
|
Type level False.
| Instances | |
|
|
Session types (protocol types)
|
|
|
Send v u denotes a protocol to emit a value of type v followed by a behavior of type u.
Use of send on a channel changes its session type from Send v u into u.
| Instances | (v ~ v', RecUnfold m u s u') => RecUnfold m (Send v u) s (Send v' u') | (v ~ v', RecFold m u s u') => RecFold m (Send v u) s (Send v' u') | (v ~ v'', u ~ u'') => Comp End (Send v u) (Send v'' u'') | (t ~ t', Dual n u' u) => Dual n (Recv t' u') (Send t u) | (t ~ t', Dual n u u') => Dual n (Send t u) (Recv t' u') | (v ~ v', RecFold2 m u u') => RecFold2 m (Send v u) (Send v' u') | (NwSendOnly u, Message v) => NwSendOnly (Send v u) | (Message v, NwSession u) => NwSession (Send v u) | (NwSession u, Message v) => NwSender (Send v u) | IsEnded (:> ss (Send x y)) F | (v ~ v'', u ~ u'') => Comp (Send v u) End (Send v'' u'') | (t ~ t', Message t, Message t', NwDual u' u) => NwDual (Recv t' u') (Send t u) | (t ~ t', Message t, Message t', NwDual u u') => NwDual (Send t u) (Recv t' u') | (t ~ t', Dual Z u u') => Comp (Recv t u) (Send t' u') Bot | (t ~ t', Dual Z u u') => Comp (Send t u) (Recv t' u') Bot |
|
|
|
|
Recv v u denotes a protocol of receiving a value of type v followed by a behavior of type u.
Use of recv on a channel changes its session type from Recv v u into u.
| Instances | (v ~ v', RecUnfold m u s u') => RecUnfold m (Recv v u) s (Recv v' u') | (v ~ v', RecFold m u s u') => RecFold m (Recv v u) s (Recv v' u') | (v ~ v'', u ~ u'') => Comp End (Recv v u) (Recv v'' u'') | (t ~ t', Dual n u' u) => Dual n (Recv t' u') (Send t u) | (t ~ t', Dual n u u') => Dual n (Send t u) (Recv t' u') | (v ~ v', RecFold2 m u u') => RecFold2 m (Recv v u) (Recv v' u') | (NwReceiveOnly u, Message v) => NwReceiveOnly (Recv v u) | (Message v, NwSession u) => NwSession (Recv v u) | (NwSession u, Message v) => NwReceiver (Recv v u) | IsEnded (:> ss (Recv x y)) F | (v ~ v'', u ~ u'') => Comp (Recv v u) End (Recv v'' u'') | (t ~ t', Message t, Message t', NwDual u' u) => NwDual (Recv t' u') (Send t u) | (t ~ t', Message t, Message t', NwDual u u') => NwDual (Send t u) (Recv t' u') | (t ~ t', Dual Z u u') => Comp (Recv t u) (Send t' u') Bot | (t ~ t', Dual Z u u') => Comp (Send t u) (Recv t' u') Bot |
|
|
|
|
Throw u1 u2 denotes a behavior to output of a channel with session type u1 followed by a behavior of type u2.
Use of sendS on a channel changes its session type from Throw u1 u2 into u2.
| Instances | |
|
|
|
Catch u1 u2 is the input of a channel with session type u1 followed by a behavior of type u2.
Use of recvS on a channel changes its session type from Catch u1 u2 into u2.
| Instances | |
|
|
|
Select u1 u2 denotes to be either behavior of type u1 or type u2 after emitting a corresponding label 1 or 2.
Use of sel1 or sel2 on a channel changes its session type from Select u1 u2 into u1 or u2, respectively.
| Instances | |
|
|
|
Offer u1 u2 denotes a behavior like either u1 or u2 according to the incoming label.
| Instances | |
|
|
|
End denotes a terminated session. Further communication along a channel with type End cannot take place.
| Instances | Comp Close End Close | Comp End Close Close | Comp End End End | Comp End Bot Bot | Comp Bot End Bot | Dual n End End | RecFold2 m End End | RecUnfold m End s End | RecFold m End s End | (u1 ~ u1'', u2 ~ u2'') => Comp End (OfferN u1 u2) (OfferN u1'' u2'') | (u1 ~ u1'', u2 ~ u2'') => Comp End (SelectN u1 u2) (SelectN u1'' u2'') | (u ~ u'', m ~ Z, m' ~ Z) => Comp End (Rec m u) (Rec m' u'') | (u1 ~ u1'', u2 ~ u2'') => Comp End (Offer u1 u2) (Offer u1'' u2'') | (u1 ~ u1'', u2 ~ u2'') => Comp End (Select u1 u2) (Select u1'' u2'') | (u1 ~ u1'', u ~ u'') => Comp End (Catch u1 u) (Catch u1'' u'') | (u1 ~ u1'', u ~ u'') => Comp End (Throw u1 u) (Throw u1'' u'') | (v ~ v'', u ~ u'') => Comp End (Recv v u) (Recv v'' u'') | (v ~ v'', u ~ u'') => Comp End (Send v u) (Send v'' u'') | Ended n ss => Ended (S n) (:> ss End) | IsEnded ss b => IsEnded (:> ss End) b | (u1 ~ u1'', u2 ~ u2'') => Comp (OfferN u1 u2) End (OfferN u1'' u2'') | (u1 ~ u1'', u2 ~ u2'') => Comp (SelectN u1 u2) End (SelectN u1'' u2'') | (u ~ u'', m ~ Z, m' ~ Z) => Comp (Rec m u) End (Rec m' u'') | (u1 ~ u1'', u2 ~ u2'') => Comp (Offer u1 u2) End (Offer u1'' u2'') | (u1 ~ u1'', u2 ~ u2'') => Comp (Select u1 u2) End (Select u1'' u2'') | (u1 ~ u1'', u ~ u'') => Comp (Catch u1 u) End (Catch u1'' u'') | (u1 ~ u1'', u ~ u'') => Comp (Throw u1 u) End (Throw u1'' u'') | (v ~ v'', u ~ u'') => Comp (Recv v u) End (Recv v'' u'') | (v ~ v'', u ~ u'') => Comp (Send v u) End (Send v'' u'') |
|
|
|
|
Bot is the type for a channel whose both endpoints are already engaged by two processes, so that no further processes can own that channel.
For example, in forkIO (send k e) >>> recv k, k has type Bot.
| Instances | |
|
|
|
Rec m r denotes recursive session, where m represents the binder of recursion variable.
a type-level natural numer (like S Z). nesting level of Rec, and
r is the body of the recursion which may contain Var m.
| Instances | (RecFold2 n s s', RecUnfold n s' xx s, RecFold m a s' r) => RecFoldCont F m n a s (Rec n r) | RecUnfoldCont T m n s (Rec m s) | RecFold2 m a r => RecFoldCont2 F m n a (Rec n r) | (TypeEq m n b, RecFoldCont2 b m n a r) => RecFold2 m (Rec n a) r | (TypeEq m n b, RecFoldCont b m n a s r) => RecFold m (Rec n a) s r | (RecFold2 n s s', RecUnfold m a s' a') => RecUnfold m (Rec n a) s (Rec n a') | (u ~ u'', m ~ Z, m' ~ Z) => Comp End (Rec m u) (Rec m' u'') | (n ~ m, n ~ m', Dual (S n) r r') => Dual n (Rec m r) (Rec m' r') | (Show m, Show r) => Show (Rec m r) | (NwReceiveOnly u, Nat m) => NwReceiveOnly (Rec m u) | (NwSendOnly u, Nat m) => NwSendOnly (Rec m u) | (NwSession u, Nat m) => NwSession (Rec m u) | IsEnded (:> ss (Rec n r)) F | (u ~ u'', m ~ Z, m' ~ Z) => Comp (Rec m u) End (Rec m' u'') | (m ~ m', NwDual r r', Nat m) => NwDual (Rec m r) (Rec m' r') | (m ~ Z, m' ~ Z, Dual (S Z) r r') => Comp (Rec m r) (Rec m' r') Bot |
|
|
|
|
Recursion variable.
| Instances | |
|
|
|
Close denotes a session that can do nothing but closing it.
| Instances | |
|
|
|
Instances | (RecUnfold m u1 s u1', RecUnfold m u2 s u2') => RecUnfold m (SelectN u1 u2) s (SelectN u1' u2') | (RecFold m u1 s u1', RecFold m u2 s u2') => RecFold m (SelectN u1 u2) s (SelectN u1' u2') | (u1 ~ u1'', u2 ~ u2'') => Comp End (SelectN u1 u2) (SelectN u1'' u2'') | (RecFold2 m u1 u1', RecFold2 m u2 u2') => RecFold2 m (SelectN u1 u2) (SelectN u1' u2') | (NwSendOnly u1, NwSendOnly u2, NwSender u1, NwSender u2) => NwSendOnly (SelectN u1 u2) | (NwSender u1, NwSender u2) => NwSession (SelectN u1 u2) | (NwSender u1, NwSender u2) => NwSender (SelectN u1 u2) | IsEnded (:> ss (SelectN x y)) F | (u1 ~ u1'', u2 ~ u2'') => Comp (SelectN u1 u2) End (SelectN u1'' u2'') | (NwReceiver u1, NwSender u1', NwReceiver u2, NwSender u2', NwDual u1 u1', NwDual u2 u2') => NwDual (OfferN u1 u2) (SelectN u1' u2') | (NwSender u1, NwReceiver u1', NwSender u2, NwReceiver u2', NwDual u1 u1', NwDual u2 u2') => NwDual (SelectN u1 u2) (OfferN u1' u2') |
|
|
|
|
Instances | (RecUnfold m u1 s u1', RecUnfold m u2 s u2') => RecUnfold m (OfferN u1 u2) s (OfferN u1' u2') | (RecFold m u1 s u1', RecFold m u2 s u2') => RecFold m (OfferN u1 u2) s (OfferN u1' u2') | (u1 ~ u1'', u2 ~ u2'') => Comp End (OfferN u1 u2) (OfferN u1'' u2'') | (RecFold2 m u1 u1', RecFold2 m u2 u2') => RecFold2 m (OfferN u1 u2) (OfferN u1' u2') | (NwReceiveOnly u1, NwReceiveOnly u2, NwReceiver u1, NwReceiver u2) => NwReceiveOnly (OfferN u1 u2) | (NwReceiver u1, NwReceiver u2) => NwSession (OfferN u1 u2) | (NwReceiver u1, NwReceiver u2) => NwReceiver (OfferN u1 u2) | IsEnded (:> ss (OfferN x y)) F | (u1 ~ u1'', u2 ~ u2'') => Comp (OfferN u1 u2) End (OfferN u1'' u2'') | (NwReceiver u1, NwSender u1', NwReceiver u2, NwSender u2', NwDual u1 u1', NwDual u2 u2') => NwDual (OfferN u1 u2) (SelectN u1' u2') | (NwSender u1, NwReceiver u1', NwSender u2, NwReceiver u2', NwDual u1 u1', NwDual u2 u2') => NwDual (SelectN u1 u2) (OfferN u1' u2') |
|
|
|
Session type environments
|
|
|
Type-level snoc (reversed version of cons (:)). ss :> s denotes a list ss with s on its end. (FIXME:English)
| Instances | |
|
|
|
Type-level empty list ([]).
| Instances | |
|
|
The Session monad
|
|
|
The Session monad. ss and tt denotes the usage of channels.
- ss denotes pre-type, which denotes the type-level list of session types required to run the session.
- tt denotes post-type, which denotes the type-level lists of session types produced by the session.
t denotes a type-tag, which prevents abuse of use of channels. For detail, see runS.
|
|
|
|
Bind (a.k.a >>=) operation for Session monad.
|
|
|
|
|
Unit (a.k.a return) operation for Session monad.
|
|
|
runS runs the Session. The pretype (see Session) must be Nil.
The posttype must be Ended, i.e. all channels must be End.
Forall'd type variable t prevents abuse of use of channels inside different run.
For example, new >>>= c -> io_ (runS ( ... send c ...) ) is rejected by the Haskell typechecker with error Inferred type is less polymorphic than expected.
|
|
Communication and concurrency primitives
|
|
Channel types
|
|
|
The channel type. The type-level number n points to the session-type in type environments. For example, in the type
Session t (Nil:>Send Int End) (Nil:>End) (),
the usage of the channel c :: Channel t Z is Send Int End in pretype and End in posttype.
|
|
|
|
|
General communication
|
|
|
|
|
|
|
|
|
|
|
|
|
output a label `1'
|
|
|
output a label `2'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Network communication
|
|
Primitives
|
|
|
|
|
|
|
|
|
output a label `1'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Type class for messages
|
|
|
|
|
Thread creation
|
|
|
|
|
start a new thread
|
|
Interfacing with the IO monad
|
|
|
|
|
|
Exception handling
|
|
|
|
Recursive protocol support
|
|
|
|
|
|
|
|
|
|
|
|
Utility functions for type inferene
|
|
|
|
|
|
Type classes for type-level operations
|
|
Type level arithmetic
|
|
class EqNat x y b | x y -> b | Source |
|
Equality on type-level natural numbers. b ~ T if x == y. Otherwise b ~ F.
| | Instances | |
|
|
|
Computes subtraction of n by n' (FIXME:OK?)
| | Instances | |
|
|
type family SubT n n' :: * | Source |
|
Computes subtraction of n by n'
|
|
|
Operations on type level lists
|
|
class SList ss l | ss -> l | Source |
|
The class which covers session-type environments. The second parameter of the class denotes the length of the list.
| | Instances | |
|
|
class Pickup ss n s | ss n -> s | Source |
|
Pickup ss n s denotes that the n-th element of the list ss is s.
This type class plays an important role in session-type inference.
Formally, Pickup ss n s if s = pickup ss n where pickup is:
pickup ss n = pickupR ss (len ss - (n+1))
where pickupR (ss:>s) Z = s
pickupR (ss:>s) (S n) = pickupR ss n
len Nil = 0
len (ss:>s) = (len ss) + 1
In other words, Pickup (End :> Bot :> Send Int End) Z End) is an instance of Pickup.
Note that the list counts from left to right.
For example, The 0-th element of the list (End :> Bot) :> Send Int End is End.
Usually the list is accessed from the right end.
The context
SList ss (S n), Pickup (ss:>Bot:>Recv Char End) n s
is expanded into
SList ss (S n), PickupR (ss:>Bot:>Recv Char End) (SubT (S n) (S n)) s, Sub (S n) (S n)
since SubT (S n) (S n) ~ Z, it will be reduced to
PickupR (ss:>Bot:>Recv Char End) Z s
and then s is unified with Recv Char End.
| | Instances | |
|
|
class PickupR ss n s | ss n -> s | Source |
|
The reversed version of Pickup which accesses lists in reversed order (counts from right to left).
I.e., PickupR (End :> Bot :> Send Int End) Z (Send Int End) is an instance of PickupR.
| | Instances | |
|
|
class Update ss n t ss' | ss n t -> ss' | Source |
|
Update ss n t ss' denotes that ss' is same as ss except that its n-th element is t.
Formally, Update ss n t ss' if ss' = update ss n t where update is:
update ss n t = updateR ss (len ss - (n+1)) t
where updateR (ss:>_) Z t = ss :> t
updateR (ss:>s) (S n) t = updateR ss n t :> s
len Nil = 0
len (ss:>s) = (len ss) + 1
In other words, Update (End :> Bot :> Send Int End) Z End (End :> Bot :> End)) is an instance of Update.
Note that the list counts from left to right, as in the case of Pickup.
| | Instances | |
|
|
class UpdateR ss n t ss' | ss n t -> ss' | Source |
|
The reversed version of Update.
| | Instances | |
|
|
Type classes for ended type environments (1)
|
|
|
Ended n ss denotes that the session-type environment ss (the length of it is n) is Ended. The all elements in an Ended type environments are End.
| | Instances | |
|
|
class IsEnded ss b | ss -> b | Source |
|
IsEnded ss b denotes that b ~ T if ss is Ended, otherwise b ~ F. In other words, b ~ T if the all elements of ss are End
| | Instances | |
|
|
Duality of session types
|
|
class Dual n s t | s -> t, t -> s | Source |
|
duality
| | Instances | |
|
|
Parallel composition of session types
|
|
class Comp s t u | s u -> t, t u -> s, s t -> u | Source |
|
sesion type algebra
| | Instances | Comp Close End Close | Comp End Close Close | Comp End End End | Comp End Bot Bot | Comp Bot End Bot | (u1 ~ u1'', u2 ~ u2'') => Comp End (OfferN u1 u2) (OfferN u1'' u2'') | (u1 ~ u1'', u2 ~ u2'') => Comp End (SelectN u1 u2) (SelectN u1'' u2'') | (u ~ u'', m ~ Z, m' ~ Z) => Comp End (Rec m u) (Rec m' u'') | (u1 ~ u1'', u2 ~ u2'') => Comp End (Offer u1 u2) (Offer u1'' u2'') | (u1 ~ u1'', u2 ~ u2'') => Comp End (Select u1 u2) (Select u1'' u2'') | (u1 ~ u1'', u ~ u'') => Comp End (Catch u1 u) (Catch u1'' u'') | (u1 ~ u1'', u ~ u'') => Comp End (Throw u1 u) (Throw u1'' u'') | (v ~ v'', u ~ u'') => Comp End (Recv v u) (Recv v'' u'') | (v ~ v'', u ~ u'') => Comp End (Send v u) (Send v'' u'') | (u1 ~ u1'', u2 ~ u2'') => Comp (OfferN u1 u2) End (OfferN u1'' u2'') | (u1 ~ u1'', u2 ~ u2'') => Comp (SelectN u1 u2) End (SelectN u1'' u2'') | (u ~ u'', m ~ Z, m' ~ Z) => Comp (Rec m u) End (Rec m' u'') | (u1 ~ u1'', u2 ~ u2'') => Comp (Offer u1 u2) End (Offer u1'' u2'') | (u1 ~ u1'', u2 ~ u2'') => Comp (Select u1 u2) End (Select u1'' u2'') | (u1 ~ u1'', u ~ u'') => Comp (Catch u1 u) End (Catch u1'' u'') | (u1 ~ u1'', u ~ u'') => Comp (Throw u1 u) End (Throw u1'' u'') | (v ~ v'', u ~ u'') => Comp (Recv v u) End (Recv v'' u'') | (v ~ v'', u ~ u'') => Comp (Send v u) End (Send v'' u'') | (m ~ Z, m' ~ Z, Dual (S Z) r r') => Comp (Rec m r) (Rec m' r') Bot | (Dual Z u1 u1', Dual Z u2 u2') => Comp (Offer u1 u2) (Select u1' u2') Bot | (Dual Z u1 u1', Dual Z u2 u2') => Comp (Select u1 u2) (Offer u1' u2') Bot | (t ~ t', Dual Z u u') => Comp (Catch t u) (Throw t' u') Bot | (t ~ t', Dual Z u u') => Comp (Throw t u) (Catch t' u') Bot | (t ~ t', Dual Z u u') => Comp (Recv t u) (Send t' u') Bot | (t ~ t', Dual Z u u') => Comp (Send t u) (Recv t' u') Bot |
|
|
|
class Par ss tt' tt | ss tt' -> tt, ss tt -> tt', tt tt' -> ss | Source |
|
pointwise extension of Comp -- FIXME: method
| | Instances | |
|
|
class Par' t ss tt' tt | t ss tt' -> tt, t ss tt -> tt', t tt tt' -> ss | Source |
|
the specialized case for ended ss -- FIXME
| | Instances | |
|
|
Type classes for ended type environments (2)
|
|
class EndedWithout n s ss | n s -> ss | Source |
|
| Instances | |
|
|
class EndedWithout' n s l ss | n s l -> ss | Source |
|
| Instances | |
|
|
class EndedWithout2 n m s t ss | n s m t -> ss | Source |
|
| Instances | |
|
|
class EndedWithout2' n m s t l ss | n m s t l -> ss | Source |
|
| Instances | |
|
|
|
| Instances | |
|
|
class AppendEnd' n ss ss' | n ss -> ss', n ss' -> ss | Source |
|
| Instances | |
|
|
class Diff xx yy zz | xx yy -> zz | Source |
|
| Instances | |
|
|
class Diff' n xx yy zz | n xx yy -> zz | Source |
|
| Instances | |
|
|
Restrictions on session types for network communication
|
|
|
|
|
|
|
| Instances | |
|
|
|
| Instances | |
|
|
|
| Instances | |
|
|
|
| Instances | NwDual Close Close | (v ~ v', Nat v) => NwDual (Var v) (Var v') | (NwReceiver u1, NwSender u1', NwReceiver u2, NwSender u2', NwDual u1 u1', NwDual u2 u2') => NwDual (OfferN u1 u2) (SelectN u1' u2') | (NwSender u1, NwReceiver u1', NwSender u2, NwReceiver u2', NwDual u1 u1', NwDual u2 u2') => NwDual (SelectN u1 u2) (OfferN u1' u2') | (m ~ m', NwDual r r', Nat m) => NwDual (Rec m r) (Rec m' r') | (t ~ t', Message t, Message t', NwDual u' u) => NwDual (Recv t' u') (Send t u) | (t ~ t', Message t, Message t', NwDual u u') => NwDual (Send t u) (Recv t' u') |
|
|
|
|
| Instances | |
|
|
|
| Instances | |
|
|
Recursive protocol
|
|
class RecFold m u s r | m u -> r | Source |
|
| Instances | |
|
|
class RecFoldCont b m n a s r | b m n a -> r | Source |
|
| Instances | |
|
|
class RecFold2 m u r | m u -> r | Source |
|
| Instances | |
|
|
class RecFoldCont2 b m n a r | b m n a -> r | Source |
|
| Instances | |
|
|
class RecUnfold m r s u | m r s -> u | Source |
|
| Instances | RecUnfold m Close s Close | RecUnfold m End s End | (TypeEq m n b, RecUnfoldCont b m n s a) => RecUnfold m (Var n) s a | (RecUnfold m u1 s u1', RecUnfold m u2 s u2') => RecUnfold m (OfferN u1 u2) s (OfferN u1' u2') | (RecUnfold m u1 s u1', RecUnfold m u2 s u2') => RecUnfold m (SelectN u1 u2) s (SelectN u1' u2') | (RecUnfold m u1 s u1', RecUnfold m u2 s u2') => RecUnfold m (Offer u1 u2) s (Offer u1' u2') | (RecUnfold m u1 s u1', RecUnfold m u2 s u2') => RecUnfold m (Select u1 u2) s (Select u1' u2') | (v ~ v', RecUnfold m u s u') => RecUnfold m (Catch v u) s (Catch v' u') | (v ~ v', RecUnfold m u s u') => RecUnfold m (Throw v u) s (Throw v' u') | (v ~ v', RecUnfold m u s u') => RecUnfold m (Recv v u) s (Recv v' u') | (v ~ v', RecUnfold m u s u') => RecUnfold m (Send v u) s (Send v' u') | (RecFold2 n s s', RecUnfold m a s' a') => RecUnfold m (Rec n a) s (Rec n a') |
|
|
|
class RecUnfoldCont b m n s a | b m n s -> a | Source |
|
| Instances | |
|
|
Type equality
|
|
|
| Instances | |
|
|
class TypeEq' q x y b | q x y -> b | Source |
|
| Instances | |
|
|
class TypeEq'' q x y b | q x y -> b | Source |
|
| Instances | |
|
|
Produced by Haddock version 2.6.0 |