# Day 6: Haskell

## TLDR : Folding

- foldr/foldl (foldRight and foldLeft)

Folding is a pretty nice operation. Basically, it runs through each element in the list and applies a desired function to it. So what’s the difference between map and foldr? Map treats each element as an individual, and just applies the function to each element only. Folding uses a binary function and recursively applies it to your list using each element as an input.

Better to see it.

foldr :: (a → b → b) → b → [a] → b

If you’re wondering why xs = [1], print out the result.

foldr gives you 1, while foldl gives you -1.

foldr_output = 1–0 (xs-acc)

foldl_ouput = 0–1 (acc-xs)

The accumulator is the last/first element that you’ll apply the function to.

That’s also when you print out the result, foldr ys = -1

(1–2)–0 = -1

foldl ys = (0–2)-1 = -3

This may seem like semantic wrangling for the sake of it, but it is a good idea to keep in mind.

While foldr doesn’t seem great just yet, think about eigenvectors and eigenvalues. Matrix multiplication seems like a great use for this stuff.

Here are some other uses of foldr

even something like length can be represented by folding.

foldr (\x → (+) 1) 0

(or)

foldr (const $ (+) 1) 0

Could probably do a lot more powerful stuff with this, but for now will leave as is.

*Note: Map is given as follows*

*map f = foldr ((:) .f) []*

*I have no idea what this means. Will read some more and then try to explain.*

Just learnt that [X..Y] will print out numbers from X to Y if X≤Y. Otherwise, it returns an empty list.

*Note : **https://www.youtube.com/watch?v=7sbxVALuuxA*

*I watched this video and while I understood we could create our own datatypes, I have no clue how to implement them to do whatever. I’ll skip that video and come back later.*