File size: 2,435 Bytes
7339b50
 
6399834
 
 
 
 
 
 
3c4c5bc
 
 
 
 
 
8e62b80
 
 
3c4c5bc
9509a36
e485eac
 
9509a36
 
e485eac
 
 
 
 
 
 
48feff6
 
9509a36
 
48feff6
 
7139673
 
3c4c5bc
 
 
7139673
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9509a36
db2b2a2
e9e13d8
d417768
 
 
9509a36
 
d417768
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48c286d
 
 
9509a36
 
48c286d
 
 
 
 
 
9509a36
 
48c286d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# Changelog of the functional-programming course

## 2025-04-11

**functors.py**

+ add `Bifunctor` section
* replace `return NotImplementedError` with `raise NotImplementedError`

## 2025-04-08

**functors.py**

* restructure the notebook
* replace `f` in the function signatures with `g` to indicate regular functions and distinguish from functors
* move `Maybe` funtor to section `More Functor instances`
+ add `Either` functor
+ add `unzip` utility function for functors


## 2025-04-07

**applicatives.py**

* the `apply` method of `Maybe` *Applicative* should return `None` when `fg` or `fa` is `None`
+ add `sequenceL` as a classmethod for `Applicative` and add examples for `Wrapper`, `Maybe`, `List`
+ add description for utility functions of `Applicative`
* refine the implementation of `IO` *Applicative*
* reimplement `get_chars` with `IO.sequenceL`
+ add an example to show that `ListMonoidal` is equivalent to `List` *Applicative*

## 2025-04-06

**applicatives.py**

- remove `sequenceL` from `Applicative` because it should be a classmethod but can't be generically implemented

## 2025-04-02

**functors.py**

+ Migrate to `python3.13`

    + Replace all occurrences of 

        ```python
        class Functor(Generic[A])
        ```

        with

        ```python
        class Functor[A]
        ```

        for conciseness

+ Use `fa` in function signatures instead of `a` when `fa` is a *Functor*

**applicatives.py**

* `0.1.0` version of notebook `06_applicatives.py`

## 2025-03-16

**functors.py**

+ Use uppercased letters for `Generic` types, e.g. `A = TypeVar("A")`
+ Refactor the `Functor` class, changing `fmap` and utility methods to `classmethod`

    For example:

    ```python
    @dataclass
    class Wrapper(Functor, Generic[A]):
        value: A

        @classmethod
        def fmap(cls, f: Callable[[A], B], a: "Wrapper[A]") -> "Wrapper[B]":
            return Wrapper(f(a.value))

    >>> Wrapper.fmap(lambda x: x + 1, wrapper)
    Wrapper(value=2)
    ```

+ Move the `check_functor_law` method from `Functor` class to a standard function
- Rename `ListWrapper` to `List` for simplicity
- Remove the `Just` class
+ Rewrite proofs

## 2025-03-13

**functors.py**

* `0.1.0` version of notebook `05_functors`

Thank [Akshay](https://github.com/akshayka) and [Haleshot](https://github.com/Haleshot) for reviewing

## 2025-03-11

**functors.py**

* Demo version of notebook `05_functors.py`