concatenate reverse and map vanish for free
play

Concatenate, Reverse and Map Vanish For Free Janis Voigtl ander - PowerPoint PPT Presentation

ICFP, October 4, 2002 Concatenate, Reverse and Map Vanish For Free Janis Voigtl ander Dresden University of Technology http://wwwtcs.inf.tu-dresden.de/ voigt Supported by the Deutsche Forschungsgemeinschaft under grant KU 1290/2-1


  1. ICFP, October 4, 2002 Concatenate, Reverse and Map Vanish For Free Janis Voigtl¨ ander Dresden University of Technology http://wwwtcs.inf.tu-dresden.de/ ∼ voigt Supported by the “Deutsche Forschungsgemeinschaft” under grant KU 1290/2-1 and by the “Gesellschaft von Freunden und F¨ orderern der TU Dresden” with a travel grant.

  2. List-Producers using + +, reverse and map : part even [1 .. 10] = [2 , 4 , 6 , 8 , 10 , 1 , 3 , 5 , 7 , 9] part :: ( α → Bool ) → [ α ] → [ α ] part p l = let f [] z = z f ( x : xs ) z = if p x then x : ( f xs z ) else f xs ( z + + [ x ]) in f l [] shuffle “whatever” = “waeervth” shuffle :: [ α ] → [ α ] shuffle [] = [] shuffle ( x : xs ) = x : ( reverse ( shuffle xs )) inits [1 .. 4] = [[] , [1] , [1 , 2] , [1 , 2 , 3] , [1 , 2 , 3 , 4]] inits :: [ α ] → [[ α ]] [] = [[]] inits inits ( x : xs ) = [] : ( map ( x :) ( inits xs )) 1

  3. Runtimes dominated by repeated List-Operations: (s) ✷ 9 inits [1 .. n ] ✷ + 8 shuffle [1 .. n ] + part even [1 .. n ] ✸ 7 ✷ 6 ✸ + 5 4 ✸ ✷ 3 + ✸ 2 + ✷ ✸ 1 + ✸ ✷ 0 n = 0 2000 4000 6000 8000 10000 12000 2

  4. Efficiency by List Abstraction ( part ): part :: ( α → Bool ) → [ α ] → [ α ] part p l = let f [] z = z f ( x : xs ) z = if p x then x : ( f xs z ) else f xs ( z + + ( x : [])) in f l [] ⇓ � :: ( α → Bool ) → [ α ] → [ α ] part � p l = vanish + part + ( λ n c a → let f [] z = z f ( x : xs ) z = if p x then x ‘ c ‘ ( f xs z ) else f xs ( z ‘ a ‘ ( x ‘ c ‘ n )) in f l n ) vanish + + :: ( ∀ β . β → ( α → β → β ) → ( β → β → β ) → β ) → [ α ] + g = g [] (:) (+ +) vanish + Such list abstraction can be performed automat- ically , based on the rank-2 polymorphic type of + and partial type inference [Chitil, 1999]! vanish + Runtimes: n = 3000 5000 7000 9000 11000 even [1 .. n ] 0.4 1.1 2.2 3.5 5.6 (s) part � even [1 .. n ] 0.004 0.006 0.009 0.012 0.015 (s) part 3

  5. � � � Efficiency by List Abstraction ( shuffle ): shuffle :: [ α ] → [ α ] [] = [] shuffle shuffle ( x : xs ) = x : ( reverse ( shuffle xs )) ⇓ :: [ α ] → [ α ] shuffle l = vanish rev ( λ n c r → shuffle let f [] = n f ( x : xs ) = x ‘ c ‘ ( r ( f xs )) in f l ) vanish rev :: ( ∀ β . β → ( α → β → β ) → ( β → β ) → β ) → [ α ] vanish rev g ⊒ g [] (:) reverse Runtimes: n = 2000 4000 6000 8000 10000 [1 .. n ] 0.33 1.3 2.8 5.0 8.0 (s) shuffle [1 .. n ] 0.005 0.01 0.016 0.02 0.025 (s) shuffle 4

  6. � � � � � � � � � Efficiency by List Abstraction ( inits ): inits :: [ α ] → [[ α ]] [] = [] : [] inits inits ( x : xs ) = [] : ( map ( x :) ( inits xs )) ⇓ :: [ α ] → [[ α ]] inits l = vanish + map ( λ n c a r m → inits rev + let f [] = [] ‘ c ‘ n f ( x : xs ) = [] ‘ c ‘ ( m ( x :) ( f xs )) in f l ) map :: ( ∀ β . · · · ) → [ α ] vanish + + rev vanish + map g ⊒ g [] (:) (+ +) reverse map rev + Runtimes: n = 1000 2000 3000 4000 5000 [1 .. n ] 0.35 1.3 3.2 6.0 9.0 (s) inits inits [1 .. n ] 0.08 0.3 0.7 1.3 2.0 (s) 5

  7. � � � � Actual Definitions of the vanish -Combinators: + :: ( ∀ β . β → ( α → β → β ) → ( β → β → β ) → β ) → [ α ] vanish + + g = g id ( λ x h ys → x : ( h ys )) ( ◦ ) [] vanish + vanish rev :: ( ∀ β . β → ( α → β → β ) → ( β → β ) → β ) → [ α ] vanish rev g = fst ( g ( λ ys → ( ys , ys )) ( λ x h ys → ( x : ( fst ( h ys )) , snd ( h ( x : ys )))) ( λ h ys → swap ( h ys )) []) map :: ( ∀ β . β → ( α → β → β ) → ( β → β → β ) → ( β → β ) vanish + + rev → (( α → α ) → β → β ) → β ) → [ α ] map g = fst ( g ( λ f ys → ( ys , ys )) vanish + rev + ( λ x h f ys → (( f x ) : ( fst ( h f ys )) , snd ( h f (( f x ) : ys )))) ( λ h 1 h 2 f ys → ( fst ( h 1 f ( fst ( h 2 f ys ))) , snd ( h 2 f ( snd ( h 1 f ys ))))) ( λ h f ys → swap ( h f ys )) ( λ k h f ys → h ( f ◦ k ) ys ) id []) 6

  8. � � � � User-Exposed Semantics of the vanish -Combinators: vanish + + :: ( ∀ β . β → ( α → β → β ) → ( β → β → β ) → β ) → [ α ] + g = g [] (:) (+ +) vanish + vanish rev :: ( ∀ β . β → ( α → β → β ) → ( β → β ) → β ) → [ α ] vanish rev g ⊒ g [] (:) reverse map :: ( ∀ β . β → ( α → β → β ) → ( β → β → β ) → ( β → β ) vanish + + rev → (( α → α ) → β → β ) → β ) → [ α ] vanish + map g ⊒ g [] (:) (+ +) reverse map rev + Proven using free theorems [Wadler, 1989], driven by the alge- braic laws: ( xs + + ys ) + + zs = xs + + ( ys + + zs ) (1) reverse ( reverse xs ) ⊑ xs (2) map f ( map k xs ) = map ( f ◦ k ) xs (3) 7

  9. � � � � � � � � � � � � � � � � � � � � � � � � � � Proof: vanish + + g = g [] (:) (+ +) Parametricity [Reynolds, 1983] gives for the type of g :: ∀ β . β → ( A → β → β ) → ( β → β → β ) → β the following free theorem [Wadler, 1989]: ( n , n ) ∈ R ∧ ( ∀ x :: A , ( l , l ) ∈ R . ( c x l , c x l ) ∈ R ) ∧ ( ∀ ( l 1 , l 1 ) ∈ R , ( l 2 , l 2 ) ∈ R . ( a l 1 l 2 , a 2 ) ∈ R ) l 1 l ⇒ ( g n c a , g n ) ∈ R . c a Instantiate with n = [], c = (:), a = (+ +), n = id , c = ( λ x h ys → x : ( h ys )), = ( ◦ ), and R = { ( l , l ) | ∀ ys :: [ A ] . l + + ys = l ys } : a ( ∀ ys . [] + + ys = ys ) ∧ ( ∀ x , l , l . ( ∀ ys . l + + ys = l ys ) ⇒ ( ∀ ys . ( x : l ) + + ys = x : ( l ys ))) ∧ ( ∀ l 1 , l 1 , l 2 , l 2 . ( ∀ ys . l 1 + + ys = l 1 ys ) ∧ ( ∀ ys . l 2 + + ys = l 2 ys ) ⇒ ( ∀ ys . ( l 1 + + l 2 ) + + ys = l 1 ( l 2 ys ))) ⇒ ( ∀ ys . ( g [] (:) (+ +)) + + ys = g id ( λ x h ys → x : ( h ys )) ( ◦ ) ys ) . The preconditions of this implication are fulfilled by the definition of (+ +) and by law (1), hence: ( g [] (:) (+ +)) + + [] = vanish + + g . 8

  10. � � � � � � A general Methodology (e.g.: the filter vanishes) nub :: Eq α ⇒ [ α ] → [ α ] [] = [] nub nub ( x : xs ) = x : ( filter ( x � =) ( nub xs )) 1. Freezing and Efficient Conversion: data List α = Nil | Cons α ( List α ) | Filter ( α → Bool ) ( List α ) :: Eq α ⇒ [ α ] → List α nub nub [] = Nil ( x : xs ) = Cons x ( Filter ( x � =) ( nub xs )) nub :: List α → [ α ] convert l = let h p = [] convert Nil h ( Cons x xs ) p = if ( p x ) then ( x : ( h xs p )) else ( h xs p ) h ( Filter q xs ) p = h xs ( λ x → q x & & p x ) in h l ( λ x → True ) 9

  11. � � � � 2. Preparing Shortcut Fusion [Gill et al. , 1993]: build List g = g Nil Cons Filter :: Eq α ⇒ [ α ] → List α nub l = build List ( λ n c f → let h [] = n nub h ( x : xs ) = c x ( f ( x � =) ( h xs )) in h l ) Nil n c f = n fold List fold List ( Cons x xs ) n c f = c x ( fold List xs n c f ) fold List ( Filter q xs ) n c f = f q ( fold List xs n c f ) :: List α → [ α ] convert l = fold List l convert ( λ p → []) ( λ x h p → if ( p x ) then ( x : ( h p )) else ( h p )) ( λ q h p → h ( λ x → q x & & p x )) ( λ x → True ) 10

  12. � � 3. Calculate using Fusion Law: fold List ( build List g ) = g ( nub l ) convert = fold List ( build List ( λ n c f → let h [] = n h ( x : xs ) = c x ( f ( x � =) ( h xs )) in h l )) ( λ p → []) ( λ x h p → if ( p x ) then ( x : ( h p )) else ( h p )) ( λ q h p → h ( λ x → q x & & p x )) ( λ x → True ) = ( λ n c f → let h [] = n h ( x : xs ) = c x ( f ( x � =) ( h xs )) in h l ) ( λ p → []) ( λ x h p → if ( p x ) then ( x : ( h p )) else ( h p )) ( λ q h p → h ( λ x → q x & & p x )) ( λ x → True ) 11

  13. � � 4. Abstract into Combinator: vanish filter g = g ( λ p → []) ( λ x h p → if ( p x ) then ( x : ( h p )) else ( h p )) ( λ q h p → h ( λ x → q x & & p x )) ( λ x → True ) :: Eq α ⇒ [ α ] → [ α ] nub nub l = vanish filter ( λ n c f → let h [] = n h ( x : xs ) = c x ( f ( x � =) ( h xs )) in h l ) 5. Prove Correctness: vanish filter :: ( ∀ β .β → ( α → β → β ) → (( α → Bool ) → β → β ) → β ) → [ α ] vanish filter g = g [] (:) filter Using a free theorem and the following law: filter p ( filter q xs ) = filter ( λ x → q x & & p x ) xs (4) 12

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