# 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