Philip Schwarz
May 28, 2022
24

# 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

May 28, 2022

## 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