---
title:
- List and Folding Lists
author:
- Sanchayan Maity
theme:
- default
classoption:
- aspectratio=169
---

# Agenda

- Lists
- Folds
- **Disclaimer:** No original material in this presentation.

# Lists recap

- Data type

```haskell
data []  a   =   []  |   a : [a]
--  [1] [2] [3] [4] [5]   [6]
```

1. The datatype with the type constructor [],
2. which takes a single type constructor argument of type a,
3. at the term level can be constructed via
4. the nullary list constructor [],
5. or it can be constructed by
6. infix data constructor (or cons) :, which is a product of a value of type a from the type constructor and a value of type [a], that is, “more list.”


# Pattern matching

```haskell
ourTail :: [a] -> [a]
ourTail [] = []
ourTail (_ : xs) = xs
```

# Syntactic sugar

```haskell
ghci> [1, 2, 3] ++ [4]
[1, 2, 3, 4]
ghci> (1 : 2 : 3 : []) ++ 4 : []
[1,2,3,4]
```

# Construction lists

```haskell
ghci> [1..10]
[1,2,3,4,5,6,7,8,9,10]
ghci> enumFromTo 1 10
[1,2,3,4,5,6,7,8,9,10]
ghci> [1,2..10]
[1,2,3,4,5,6,7,8,9,10]
ghci> enumFromThenTo 1 2 10
[1,2,3,4,5,6,7,8,9,10]
ghci> [1,3..10]
[1,3,5,7,9]
ghci> enumFromThenTo 1 3 10
[1,3,5,7,9]
ghci> ['t'..'z']
"tuvwxyz"
ghci> enumFromTo 't' 'z'
"tuvwxyz"
```

# Extracting from lists

```haskell
take :: Int -> [a] -> [a]
drop :: Int -> [a] -> [a]
splitAt :: Int -> [a] -> ([a], [a])

takeWhile :: (a -> Bool) -> [a] -> [a]
dropWhile :: (a -> Bool) -> [a] -> [a]
```

# List comprehensions

```haskell
ghci> [x^y | x <- [1..5], y <- [2, 3]]
[1,1,4,8,9,27,16,64,25,125]
```

# Evaluation

```
1 : (2 : [])
  :
  / \
  1
    :
    / \
    2 []
```

See `sprint` command.

```haskell
ghci> blah = enumFromTo 'a' 'z'
ghci> :sprint blah
```

**Spines are evaluated independently of values**.

# Miscellaneous

- `map`
- `filter`
- `zip`

# Patterns

```haskell
sum :: [Integer] -> Integer
sum [] = 0
sum (x:xs) = x + sum xs

length :: [a] -> Integer
length [] = 0
length (_:xs) = 1 + length xs

product :: [Integer] -> Integer
product [] = 1
product (x:xs) = x * product xs

concat :: [[a]] -> [a]
concat [] = []
concat (x:xs) = x ++ concat xs
```

# Folds types

```haskell
foldr :: Foldable t => (a -> b -> b) -> b -> t a -> b
foldr :: (a -> b -> b) -> b -> [] a -> b

foldl :: (b -> a -> b) -> b -> [a] -> b
foldl f acc [] = acc
foldl f acc (x:xs) = foldl f (f acc x) xs
```

# Right fold transformation[^1]

![*Right Fold*](./Right-fold-transformation.png){width=60%}

[^1]: [Haskell Wiki - Fold](https://wiki.haskell.org/Fold)


# Left fold transformation[^2]

![*Left Fold*](./Left-fold-transformation.png){width=60%}

[^2]: [Haskell Wiki - Fold](https://wiki.haskell.org/Fold)

# Folds in-depth

- An aside from Alexis King.

https://github.com/hasura/graphql-engine/pull/2933#discussion_r328821960

# Questions

- Reach out on
  * Email: sanchayan@sanchayanmaity.net
  * Mastodon: https://sanchayanmaity.com/@sanchayan
  * Blog: https://sanchayanmaity.net
  * Telegram:
    - `t.me/fpncr`
    - `t.me/SanchayanMaity`
