-
Notifications
You must be signed in to change notification settings - Fork 2
Open
Milestone
Description
As discussed during today's Tuura meeting, we need a way to compose two concepts by matching some of their interface signals. As a simple example, consider connecting two buffers together in sequence:
data S1 = A | B | C | ...
b1 :: CircuitConcept S1
b1 = buffer A B
data S2 = X | Y | ...
b2 :: CircuitConcept S2
b2 = buffer X Y
-- This won't compile due to type mismatch
composition = b1 <> b2How do we tell that we want to connect b1's output B to b2's input X?
A good solution seems to rely on wrappers:
wrap :: (a -> b) -> CircuitConcept a -> CircuitConcept b
wrap = ...
map21 :: S2 -> S1
map21 X = B
map21 Y = C
composition :: CircuitConcept S1
composition = b1 <> wrap map21 b2An alert reader will spot that wrap is just an fmap! Indeed, all we need to do is to write a Functor instance for CircuitConcept, and then we will be able to wrap simply by fmap map21 b2 or map21 <$> b2 using a fancy standard operator.
I'll give this a try.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels