reversible effects as inverse arrows
play

Reversible effects as inverse arrows Chris Heunen Robin Kaarsgaard - PowerPoint PPT Presentation

Reversible effects as inverse arrows Chris Heunen Robin Kaarsgaard Martti Karvonen 1 / 17 Outline Arrows add non-functional side-effects to functional languages Reversible languages take semantics in inverse categories Arrows


  1. Reversible effects as inverse arrows Chris Heunen Robin Kaarsgaard Martti Karvonen 1 / 17

  2. Outline ◮ Arrows add non-functional side-effects to functional languages ◮ Reversible languages take semantics in inverse categories Arrows categories Inverse arrows inverse categories dagger arrows dagger categories ◮ Many examples of inverse arrows 2 / 17

  3. Reversible and invertible programming Functional languages not stateful by definition, easing reversibility (e.g. Theseus, RFun) 3 / 17

  4. Monads return : X → M X ( > > =) : M X → ( X → M Y ) → M Y such that: return x > > = f = fx = return = m > > m ( m > > = f ) > > = g = m > > = ( λx.fx > > = g ) 4 / 17

  5. Monads return : X → M X ( > > =) : M X → ( X → M Y ) → M Y think: ◮ M X is (effectful) computation of type X ◮ return x is constant computation ◮ composition > > = should behave 4 / 17

  6. Arrows arr : ( X → Y ) → A X Y ( > > > ) : A X Y → A Y Z → A X Z first X,Y,Z : A X Y → A ( X ⊗ Z ) ( Y ⊗ Z ) such that: ( a > > b ) > = > ( b > > c ) > > > c a > > > arr( g ◦ f ) = arr f > > > arr g arr id > = = > arr id > > a a a > > first X,Y,I a > > > arr ρ Y = arr ρ X > > > a first X,Y,Z a > > > arr(id Y ⊗ f ) = arr(id X ⊗ f ) > > > first X,Y,Z a (first X,Y,Z ⊗ V a ) > > > arr α Y,Z,V = arr α X,Z,V > > > first(first a ) first(arr f ) = arr( f ⊗ id) first( a > > b ) = (first a ) > > (first b ) > > 5 / 17

  7. Arrows arr : ( X → Y ) → A X Y ( > > > ) : A X Y → A Y Z → A X Z first X,Y,Z : A X Y → A ( X ⊗ Z ) ( Y ⊗ Z ) think: ◮ A X Y is type of effectful computations from X to Y ◮ arr makes pure computation effectful ◮ composition > > > behaves properly ◮ first lets effectful computations interact with environment first A X A Y Z Z 5 / 17

  8. Dagger and inverse arrows inv : A X Y → A Y X such that: inv(inv a ) = a inv a > > > inv b = inv( b > > > a ) arr( f † ) = inv(arr f ) inv(first a ) = first(inv a ) ( a > > inv a ) > = > > > a a ( a > > > inv a ) > > > ( b > > > inv b ) = ( b > > > inv b ) > > > ( a > > > inv a ) 6 / 17

  9. Dagger and inverse arrows inv : A X Y → A Y X think: ◮ inv turns effectful computations around ◮ cooperates with pure computations and environments ◮ inv a ‘undoes’ a 6 / 17

  10. Example: reversible state type State S X Y = X → ( S ⊸ ( X ⊗ S )) type RState S X Y = X ⊗ S ↔ Y ⊗ S instance Arrow ( RState S ) where arr f ( x , s ) = ( f x , s ) ( a > > > b )( x , s ) = b ( a ( x , s )) first a (( x , z ) , s ) = let ( x ′ , s ′ ) = a ( x , s ) in (( x ′ , z ) , s ′ ) instance InverseArrow ( RStateS ) where inv a ( y , s ) = a † ( y , s ) 7 / 17

  11. Example: reversible state type State S X Y = X → ( S ⊸ ( X ⊗ S )) type RState S X Y = X ⊗ S ↔ Y ⊗ S instance Arrow ( RState S ) where arr f ( x , s ) = ( f x , s ) ( a > > > b )( x , s ) = b ( a ( x , s )) first a (( x , z ) , s ) = let ( x ′ , s ′ ) = a ( x , s ) in (( x ′ , z ) , s ′ ) instance InverseArrow ( RStateS ) where inv a ( y , s ) = a † ( y , s ) get : RState S X ( X ⊗ S ) get ( x , s ) = (( x , s ) , s ) : ( S ↔ S ) → RState S X X update update f ( x , s ) = ( x , f s ) 7 / 17

  12. Example: rewriter class Group G where gunit : G gmul : G → ( G ↔ G ) ginv : G ↔ G type Rewriter G X Y = X ⊗ G ↔ Y ⊗ G 8 / 17

  13. Example: rewriter class Group G where gunit : G gmul : G → ( G ↔ G ) ginv : G ↔ G type Rewriter G X Y = X ⊗ G ↔ Y ⊗ G rewrite : G → RewriterG X X rewrite a ( x , b ) = ( x , gmul a b ) 8 / 17

  14. Example: vector transformations type Vector X Y = [ X ] ↔ [ Y ] instance Arrow ( Vector ) where arr f xs = map f xs ( a > > b ) xs = b ( a xs ) > = let ( xs , zs ) = zip † ps in zip ( a xs , zs ) first a ps instance InverseArrow ( Vector ) where inv a ys = a † ys : ( a ↔ b ) → ([ a ] ↔ [ b ]) map map f [] = [] map f ( x :: xs ) = ( f x )::( map f xs ) zip : ([ a ] , [ b ]) ↔ [( a , b )] zip ([] , []) = [] zip ( x :: xs , y :: ys ) = ( x , y )::( zip ( xs , ys )) 9 / 17

  15. Example: serialization serialize : X ↔ Serialized X type Serializer X Y = X ↔ Serialized Y instance Arrow ( Serializer ) where arr f x = serialize ( f x ) > b ) x = b ( serialize † ( a x )) ( a > > first a ( x , z ) = serialize ( serialize † ( a x ) , z ) instance InverseArrow ( Serializer ) where inv a y = serialize ( a † ( serialize y )) 10 / 17

  16. Example: error handling type Error E X Y = X ⊕ E ↔ Y ⊕ E instance WeakArrow ( Error E ) where arr f ( InL x ) = InL ( f x ) arr f ( InR e ) = InR e ( a > > > b ) x = b ( a x ) instance InverseWeakArrow ( Error E ) where inv a y = a † y 11 / 17

  17. Example: error handling type Error E X Y = X ⊕ E ↔ Y ⊕ E instance WeakArrow ( Error E ) where arr f ( InL x ) = InL ( f x ) arr f ( InR e ) = InR e ( a > > > b ) x = b ( a x ) instance InverseWeakArrow ( Error E ) where inv a y = a † y raise : ( X ↔ E ) → ( E ↔ E ⊕ E ) → Error E X Y raise f p x = InR ( p † ( arr f x ))) 11 / 17

  18. Example: superoperators Quantum physical maps f : X → Y don’t just take states to states. Must respect entanglement with environment: so f ⊗ id : X ⊗ E → Y ⊗ E takes states to states. Leads to CPM construction, not a monad, but dagger arrow: A X Y = { completely positive maps X ∗ ⊗ X → Y ∗ ⊗ Y } arr f = f ∗ ⊗ f a > > > b = b ◦ a first X,Y,Z a = a ⊗ id Z ∗ ⊗ Z inv a = a † 12 / 17

  19. Examples: many more ◮ Pure functions: program inverter ◮ Dagger Frobenius monads, restriction monads ◮ Control flow: ArrowChoice ◮ Computation in context: type Reader C X Y = X ⊗ C ↔ Y ⊗ C ◮ Information effects [James & Sabry]: irreversible computation in pure reversible setting with inverse arrow for implicit communication with heap and garbage dump ◮ Reversible IO: must be built into programming language ◮ Reversible recursion: type separating non/terminating functions 13 / 17

  20. Reversible categories f † f ← Y with f †† = f ◮ In dagger category, X → Y has partner X ◮ In inverse category, moreover: ◮ f ◦ f † ◦ f = f ◮ f † ◦ f ◦ g † ◦ g = g † ◦ g ◦ f † ◦ f ◮ If monoidal, also want ( f ⊗ g ) † = f † ⊗ g † Examples: ◮ Any groupoid ◮ Sets and relations ◮ Sets and partial injections (universal) ◮ Hilbert spaces 14 / 17

  21. Arrows, categorically ◮ Monoid: object M with maps M ⊗ M → M ← I satisfying laws ◮ Monad on C is monoid in endofunctor category [ C , C ] ◮ Profunctors C op × C → Set are monoidal under � Y ( F ⊗ G )( X, Z ) = F ( X, Y ) × G ( Y, Z ) Theorem (2006): Arrow = strong monoid in [ C op × C , Set ] 15 / 17

  22. Dagger arrows, categorically ◮ Involutive monoidal category has functor ( − ): C → C with f = f and coherent natural X ⊗ Y ≃ Y ⊗ X ◮ Involutive monoid is monoid with monoid map i : M → M satisfying i ◦ i = id Lemma : if C is dagger, then [ C op × C , Set ] is involutive F ( f, g ) = F ( g † , f † ) α X,Y = α Y,X Theorem : Dagger arrow = involutive monoid in [ C op × C , Set ] Inverse arrow makes three additional diagrams commute 16 / 17

  23. Conclusion ◮ definition of inverse arrow ◮ supports many examples ◮ has clean categorical structure ◮ informs sound reversible programming language design ◮ (un)do-notation 17 / 17

  24. References ◮ “Arrows, like Monads, are Monoids” C. Heunen, B. Jacobs, MFPS, 2006 ◮ “Categorical semantics for Arrows” B. Jacobs, C. Heunen, I. Hasuo, Journal of Functional Programming, 2009 ◮ “Reversible monadic programming” C. Heunen, M. Karvonen, MFPS, 2015 ◮ “Monads on dagger categories” C. Heunen, M. Karvonen, Theory and Applications of Categories, 2016 ◮ “Join inverse categories as models of reversible recursion” H. B. Axelsen, R. Kaarsgaard, FoSSaCS, 2016 ◮ “Join inverse categories and reversible recursion” R. Kaarsgaard, H. B. Axelsen, R. Gluck, Journal of Logical and Algebraic Methods in Programming, 2017 1 / 6

  25. Involutive monoidal categories Functor ( − ): C → C with f = f , coherent natural X ⊗ Y ≃ Y ⊗ X : α X ⊗ ( Y ⊗ Z ) ( X ⊗ Y ) ⊗ Z χ X ⊗ Y Y ⊗ X id ⊗ χ χ ⊗ id χ id X ⊗ Z ⊗ Y Y ⊗ X ⊗ Z χ α X ⊗ Y X ⊗ Y id ( Z ⊗ Y ) ⊗ X Z ⊗ ( Y ⊗ X ) α 2 / 6

  26. Inverse arrow laws L : [ C op × C , Set ] → [ C op × C , Set ] LM ( X, Y ) = M ( X, X ) LM ( f, g ) = f † ◦ ( − ) ◦ f For M involutive monoid: L + M ( X, Y ) = { a † ◦ a ∈ M ( X, X ) | a ∈ M ( X, Z ) for some Z } 3 / 6

  27. Inverse arrow law 1 g † ◦ g ◦ b † ◦ b = b † ◦ b ◦ g † ◦ g for pure g L + (hom) × LM → LM ( g † ◦ g, a ) �→ g † ◦ g ◦ a L + M × L + (hom) LM × L + (hom) σ L + (hom) × L + M L + (hom) × LM LM 4 / 6

  28. Inverse arrow law 2 a † ◦ a ◦ b † ◦ b = b † ◦ b ◦ a † ◦ a L + M × L + M → LM ( a † ◦ a, b † ◦ b ) �→ a † ◦ a ◦ b † ◦ b σ L + M × L + M L + M × L + M LM 5 / 6

  29. Inverse arrow law 3 a ◦ a † ◦ a = a D M ֒ → M × M × M D M ( X, Y ) = { ( a, a † , a ) | a ∈ M ( X, Y ) } D M M id M 6 / 6

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend