{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE InstanceSigs #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeAbstractions #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
module Circuit.Layer
(
Cat2,
(:~>),
Layer (..),
Free (..),
freeze,
lower,
)
where
import Circuit.Category (Category (..))
import Circuit.Channel (Channel (..), Strength (..), Traced (..))
import Data.Kind (Constraint, Type)
import Prelude hiding (id, (.))
type Cat2 = Type -> Type -> Type
type arr :~> arr' = forall x y. arr x y -> arr' x y
class Layer (f :: Cat2 -> Cat2) where
type Law f (arr' :: Cat2) :: Constraint
type Run f (arr :: Cat2) :: Constraint
type Run f arr = ()
type Bind f (arr :: Cat2) :: Constraint
type Bind f arr = ()
unit :: (Category arr) => arr :~> f arr
run ::
(Run f arr, Law f arr, Bind f arr) =>
f arr a b ->
arr a b
run = (arr :~> arr) -> f arr a b -> arr a b
forall (arr' :: Cat2) (arr :: Cat2) a b.
(Law f arr', Bind f arr) =>
(arr :~> arr') -> f arr a b -> arr' a b
forall (f :: Cat2 -> Cat2) (arr' :: Cat2) (arr :: Cat2) a b.
(Layer f, Law f arr', Bind f arr) =>
(arr :~> arr') -> f arr a b -> arr' a b
bind arr x y -> arr x y
forall a. a -> a
arr :~> arr
forall k (arr :: k -> k -> *) (a :: k). Category arr => arr a a
id
bind ::
(Law f arr', Bind f arr) =>
(arr :~> arr') ->
f arr a b ->
arr' a b
lower :: (Layer f, Category arr) => (f arr :~> arr') -> (arr :~> arr')
lower :: forall (f :: Cat2 -> Cat2) (arr :: Cat2) (arr' :: Cat2).
(Layer f, Category arr) =>
(f arr :~> arr') -> arr :~> arr'
lower f arr :~> arr'
g = f arr x y -> arr' x y
f arr :~> arr'
g (f arr x y -> arr' x y)
-> (arr x y -> f arr x y) -> arr x y -> arr' x y
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall k (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
. arr x y -> f arr x y
arr :~> f arr
forall (arr :: Cat2). Category arr => arr :~> f arr
forall (f :: Cat2 -> Cat2) (arr :: Cat2).
(Layer f, Category arr) =>
arr :~> f arr
unit
data Free arr a b where
Lift :: arr a b -> Free arr a b
Compose :: Free arr b c -> Free arr a b -> Free arr a c
instance (Category arr) => Category (Free arr) where
id :: forall (a :: k). Free arr a a
id = arr a a -> Free arr a a
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k).
arr a b -> Free arr a b
Lift arr a a
forall (a :: k). arr a a
forall k (arr :: k -> k -> *) (a :: k). Category arr => arr a a
id
. :: forall (b :: k) (c :: k) (a :: k).
Free arr b c -> Free arr a b -> Free arr a c
(.) = Free arr b c -> Free arr a b -> Free arr a c
forall {k} (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Free arr b c -> Free arr a b -> Free arr a c
Compose
instance Layer Free where
type Law Free arr' = Category arr'
type Run Free arr = Category arr
type Bind Free arr = ()
unit :: forall (arr :: Cat2). Category arr => arr :~> Free arr
unit = arr x y -> Free arr x y
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k).
arr a b -> Free arr a b
Lift
bind :: forall arr' arr a b. (Law Free arr') => (arr :~> arr') -> Free arr a b -> arr' a b
bind :: forall (arr' :: Cat2) (arr :: Cat2) a b.
Law Free arr' =>
(arr :~> arr') -> Free arr a b -> arr' a b
bind arr :~> arr'
h (Lift arr a b
f) = arr a b -> arr' a b
arr :~> arr'
h arr a b
f
bind arr :~> arr'
h (Compose @_ @_ Free arr b b
g Free arr a b
f) = (arr :~> arr') -> Free arr b b -> arr' b b
forall (arr' :: Cat2) (arr :: Cat2) a b.
(Law Free arr', Bind Free arr) =>
(arr :~> arr') -> Free arr a b -> arr' a b
forall (f :: Cat2 -> Cat2) (arr' :: Cat2) (arr :: Cat2) a b.
(Layer f, Law f arr', Bind f arr) =>
(arr :~> arr') -> f arr a b -> arr' a b
bind arr x y -> arr' x y
arr :~> arr'
h Free arr b b
g arr' b b -> arr' a b -> arr' a b
forall b c a. arr' b c -> arr' a b -> arr' a c
forall k (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
. (arr :~> arr') -> Free arr a b -> arr' a b
forall (arr' :: Cat2) (arr :: Cat2) a b.
(Law Free arr', Bind Free arr) =>
(arr :~> arr') -> Free arr a b -> arr' a b
forall (f :: Cat2 -> Cat2) (arr' :: Cat2) (arr :: Cat2) a b.
(Layer f, Law f arr', Bind f arr) =>
(arr :~> arr') -> f arr a b -> arr' a b
bind arr x y -> arr' x y
arr :~> arr'
h Free arr a b
f
freeze :: (Category arr) => Free arr a b -> arr a b
freeze :: forall {k} (arr :: k -> k -> *) (a :: k) (b :: k).
Category arr =>
Free arr a b -> arr a b
freeze (Lift arr a b
f) = arr a b
f
freeze (Compose Free arr b b
g Free arr a b
f) = Free arr b b -> arr b b
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k).
Category arr =>
Free arr a b -> arr a b
freeze Free arr b b
g arr b b -> arr a b -> arr a b
forall (b :: k) (c :: k) (a :: k). arr b c -> arr a b -> arr a c
forall k (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
. Free arr a b -> arr a b
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k).
Category arr =>
Free arr a b -> arr a b
freeze Free arr a b
f
instance (Channel t arr) => Channel t (Free arr) where
assoc :: forall (a :: k) (b :: k) (c :: k).
Free arr (t (t a b) c) (t a (t b c))
assoc = arr (t (t a b) c) (t a (t b c))
-> Free arr (t (t a b) c) (t a (t b c))
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k).
arr a b -> Free arr a b
Lift arr (t (t a b) c) (t a (t b c))
forall (a :: k) (b :: k) (c :: k). arr (t (t a b) c) (t a (t b c))
forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (a :: k)
(b :: k) (c :: k).
Channel t arr =>
arr (t (t a b) c) (t a (t b c))
assoc
assoc' :: forall (a :: k) (b :: k) (c :: k).
Free arr (t a (t b c)) (t (t a b) c)
assoc' = arr (t a (t b c)) (t (t a b) c)
-> Free arr (t a (t b c)) (t (t a b) c)
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k).
arr a b -> Free arr a b
Lift arr (t a (t b c)) (t (t a b) c)
forall (a :: k) (b :: k) (c :: k). arr (t a (t b c)) (t (t a b) c)
forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (a :: k)
(b :: k) (c :: k).
Channel t arr =>
arr (t a (t b c)) (t (t a b) c)
assoc'
slide :: forall (a :: k) (b :: k) (c :: k).
Free arr (t a (t b c)) (t b (t a c))
slide = arr (t a (t b c)) (t b (t a c))
-> Free arr (t a (t b c)) (t b (t a c))
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k).
arr a b -> Free arr a b
Lift arr (t a (t b c)) (t b (t a c))
forall (a :: k) (b :: k) (c :: k). arr (t a (t b c)) (t b (t a c))
forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (a :: k)
(b :: k) (c :: k).
Channel t arr =>
arr (t a (t b c)) (t b (t a c))
slide
instance (Strength t arr) => Strength t (Free arr) where
strength :: forall (b :: k) (c :: k) (a :: k).
Free arr b c -> Free arr (t a b) (t a c)
strength = arr (t a b) (t a c) -> Free arr (t a b) (t a c)
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k).
arr a b -> Free arr a b
Lift (arr (t a b) (t a c) -> Free arr (t a b) (t a c))
-> (arr b c -> arr (t a b) (t a c))
-> arr b c
-> Free arr (t a b) (t a c)
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall k (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
. arr b c -> arr (t a b) (t a c)
forall (b :: k) (c :: k) (a :: k). arr b c -> arr (t a b) (t a c)
forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (b :: k)
(c :: k) (a :: k).
Strength t arr =>
arr b c -> arr (t a b) (t a c)
strength (arr b c -> Free arr (t a b) (t a c))
-> (Free arr b c -> arr b c)
-> Free arr b c
-> Free arr (t a b) (t a c)
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall k (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
. Free arr b c -> arr b c
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k).
Category arr =>
Free arr a b -> arr a b
freeze
instance (Traced t arr) => Traced t (Free arr) where
trace :: forall (a :: k) (b :: k) (c :: k).
Free arr (t a b) (t a c) -> Free arr b c
trace = arr b c -> Free arr b c
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k).
arr a b -> Free arr a b
Lift (arr b c -> Free arr b c)
-> (arr (t a b) (t a c) -> arr b c)
-> arr (t a b) (t a c)
-> Free arr b c
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall k (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
. arr (t a b) (t a c) -> arr b c
forall (a :: k) (b :: k) (c :: k). arr (t a b) (t a c) -> arr b c
forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (a :: k)
(b :: k) (c :: k).
Traced t arr =>
arr (t a b) (t a c) -> arr b c
trace (arr (t a b) (t a c) -> Free arr b c)
-> (Free arr (t a b) (t a c) -> arr (t a b) (t a c))
-> Free arr (t a b) (t a c)
-> Free arr b c
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall k (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
. Free arr (t a b) (t a c) -> arr (t a b) (t a c)
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k).
Category arr =>
Free arr a b -> arr a b
freeze