Skip to content

Commit

Permalink
Create separated page in functional programming (rust-unofficial#184)
Browse files Browse the repository at this point in the history
  • Loading branch information
MarcoIeni authored Jan 20, 2021
1 parent bfbc505 commit c41be87
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 64 deletions.
1 change: 1 addition & 0 deletions SUMMARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
- [Deref Polymorphism](./anti_patterns/deref.md)

- [Functional Programming](./functional/index.md)
- [Programming paradigms](./functional/paradigms.md)

- [Additional Resources](./additional_resources/index.md)
- [Design principles](./additional_resources/design-principles.md)
72 changes: 8 additions & 64 deletions functional/index.md
Original file line number Diff line number Diff line change
@@ -1,66 +1,10 @@
# Functional Usage of Rust

Rust is an imperative language, but it follows many functional programming paradigms.
One of the biggest hurdles to understanding functional programs when coming from an imperative background is the shift in thinking.
Imperative programs describe __how__ to do something, whereas declarative programs describe __what__ to do.
Let's sum the numbers from 1 to 10 to show this.

## Imperative

```rust
let mut sum = 0;
for i in 1..11 {
sum += i;
}
println!("{}", sum);
```

With imperative programs, we have to play compiler to see what is happening.
Here, we start with a `sum` of `0`.
Next, we iterate through the range from 1 to 10.
Each time through the loop, we add the corresponding value in the range.
Then we print it out.

| `i` | `sum` |
|:---:|:-----:|
| 1 | 1 |
| 2 | 3 |
| 3 | 6 |
| 4 | 10 |
| 5 | 15 |
| 6 | 21 |
| 7 | 28 |
| 8 | 36 |
| 9 | 45 |
| 10 | 55 |

This is how most of us start out programming. We learn that a program is a set of steps.

## Declarative

```rust
println!("{}", (1..11).fold(0, |a, b| a + b));
```

Whoa! This is really different! What's going on here? Remember that with declarative programs
we are describing __what__ to do, rather than __how__ to do it.
`fold` is a function that [composes](https://en.wikipedia.org/wiki/Function_composition) functions. The name is a convention from Haskell.

Here, we are composing functions of addition (this closure: `|a, b| a + b)`) with a range from 1 to 10.
The `0` is the starting point, so `a` is `0` at first.
`b` is the first element of the range, `1`. `0 + 1 = 1` is the result.
So now we `fold` again, with `a = 1`, `b = 2` and so `1 + 2 = 3` is the next result.
This process continues until we get to the last element in the range, `10`.

| `a` | `b` | result |
|:---:|:---:|:------:|
| 0 | 1 | 1 |
| 1 | 2 | 3 |
| 3 | 3 | 6 |
| 6 | 4 | 10 |
| 10 | 5 | 15 |
| 15 | 6 | 21 |
| 21 | 7 | 28 |
| 28 | 8 | 36 |
| 36 | 9 | 45 |
| 45 | 10 | 55 |
Rust is an imperative language, but it follows many
[functional programming](https://en.wikipedia.org/wiki/Functional_programming) paradigms.

> In computer science, *functional programming* is a programming paradigm where
> programs are constructed by applying and composing functions.
> It is a declarative programming paradigm in which function definitions are
> trees of expressions that each return a value, rather than a sequence of
> imperative statements which change the state of the program.
66 changes: 66 additions & 0 deletions functional/paradigms.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# Programming paradigms

One of the biggest hurdles to understanding functional programs when coming from an imperative background is the shift in thinking.
Imperative programs describe __how__ to do something, whereas declarative programs describe __what__ to do.
Let's sum the numbers from 1 to 10 to show this.

## Imperative

```rust
let mut sum = 0;
for i in 1..11 {
sum += i;
}
println!("{}", sum);
```

With imperative programs, we have to play compiler to see what is happening.
Here, we start with a `sum` of `0`.
Next, we iterate through the range from 1 to 10.
Each time through the loop, we add the corresponding value in the range.
Then we print it out.

| `i` | `sum` |
|:---:|:-----:|
| 1 | 1 |
| 2 | 3 |
| 3 | 6 |
| 4 | 10 |
| 5 | 15 |
| 6 | 21 |
| 7 | 28 |
| 8 | 36 |
| 9 | 45 |
| 10 | 55 |

This is how most of us start out programming. We learn that a program is a set of steps.

## Declarative

```rust
println!("{}", (1..11).fold(0, |a, b| a + b));
```

Whoa! This is really different! What's going on here?
Remember that with declarative programs we are describing __what__ to do, rather than __how__ to do it.
`fold` is a function that [composes](https://en.wikipedia.org/wiki/Function_composition) functions.
The name is a convention from Haskell.

Here, we are composing functions of addition (this closure: `|a, b| a + b`) with a range from 1 to 10.
The `0` is the starting point, so `a` is `0` at first.
`b` is the first element of the range, `1`. `0 + 1 = 1` is the result.
So now we `fold` again, with `a = 1`, `b = 2` and so `1 + 2 = 3` is the next result.
This process continues until we get to the last element in the range, `10`.

| `a` | `b` | result |
|:---:|:---:|:------:|
| 0 | 1 | 1 |
| 1 | 2 | 3 |
| 3 | 3 | 6 |
| 6 | 4 | 10 |
| 10 | 5 | 15 |
| 15 | 6 | 21 |
| 21 | 7 | 28 |
| 28 | 8 | 36 |
| 36 | 9 | 45 |
| 45 | 10 | 55 |

0 comments on commit c41be87

Please sign in to comment.