Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Defining filter using (a) recursion (b) folding...

Defining filter using (a) recursion (b) folding (c) folding with S, B and I combinators (d) folding with applicative functor and identity function

Defining filter using
(a) recursion
(b) folding
(c) folding with S, B and I combinators
(d) folding with applicative functor and identity function

Keywords: applicative functor, combinatorial logic, combinators, filter, fold, foldr, foldright, functional programming, haskell curry, raymond smullyan, recursion

Philip Schwarz

May 28, 2022
Tweet

More Decks by Philip Schwarz

Other Decks in Programming

Transcript

  1. filter :: (a -> Bool) -> [a] -> [a] filter

    _ [] = [] filter p (x:xs) = if (p x) then x:(filter p xs) else filter p xs -- Haskell Curry's combinators S, B and I s f g x = f x (g x) b f g x = f (g x) i x = x -- Raymond Smullyan's combinator bird names starling = s blueBird = b idiot = i -- returns x when c is False -- and y when c is True bool x y c = if c then y else x -- Alternative combinator names distributor = s compositor = b identity = i filter p = foldr (s (b (bool i) (:)) p) [] filter p = foldr (starling (blueBird (bool idiot) (:)) p) [] filter p = foldr (distributor (compositor (bool identity) (:)) p) [] filter p = foldr ((<*>) ((.) (bool id) (:)) p) [] filter p = foldr (((bool id) . (:)) <*> p) [] filter p = foldr (bool id . (:) <*> p) [] recursive definition folding with combinators Curry’s combinator names Smullyan’s combinator names Alternative combinator names prefix function invocation infix function invocation no superfluous parentheses folding with applicative functor and identity function filter p = foldr (\x -> if p x then (:) x else id) [] folding