├── .editorconfig ├── .envrc ├── .github ├── settings.yml └── workflows │ ├── nix-flake-check.yaml │ ├── nix-fmt-checks.yaml │ ├── prettier-checks.yaml │ └── release.yaml ├── .gitignore ├── .latexindent.yaml ├── .prettierignore ├── .prettierrc ├── LICENSE ├── Makefile ├── README.md ├── errata-1.0.0.md ├── errata-1.3.0.md ├── errata-scala.md ├── flake.lock ├── flake.nix └── src ├── acknowledgments.tex ├── category.tex ├── colophon.tex ├── content ├── 0.0 │ ├── images │ │ ├── beauvais_interior_supports.jpg │ │ └── img_1299.jpg │ └── preface.tex ├── 1.1 │ ├── category-the-essence-of-composition.tex │ ├── code │ │ ├── haskell │ │ │ ├── snippet01.hs │ │ │ ├── snippet02.hs │ │ │ ├── snippet03.hs │ │ │ ├── snippet04.hs │ │ │ ├── snippet05.hs │ │ │ └── snippet06.hs │ │ ├── ocaml │ │ │ ├── snippet01.ml │ │ │ ├── snippet02.ml │ │ │ ├── snippet03.ml │ │ │ ├── snippet04.ml │ │ │ ├── snippet05.ml │ │ │ └── snippet06.ml │ │ ├── reason │ │ │ ├── snippet01.re │ │ │ ├── snippet02.re │ │ │ ├── snippet03.re │ │ │ ├── snippet04.re │ │ │ ├── snippet05.re │ │ │ └── snippet06.re │ │ └── scala │ │ │ ├── snippet01.scala │ │ │ ├── snippet02.scala │ │ │ ├── snippet03.scala │ │ │ ├── snippet04.scala │ │ │ ├── snippet05.scala │ │ │ └── snippet06.scala │ └── images │ │ └── img_1330.jpg ├── 1.10 │ ├── code │ │ ├── haskell │ │ │ ├── snippet01.hs │ │ │ ├── snippet02.hs │ │ │ ├── snippet03.hs │ │ │ ├── snippet04.hs │ │ │ ├── snippet05.hs │ │ │ ├── snippet06.hs │ │ │ ├── snippet07.hs │ │ │ ├── snippet08.hs │ │ │ ├── snippet09.hs │ │ │ ├── snippet10.hs │ │ │ ├── snippet11.hs │ │ │ ├── snippet12.hs │ │ │ ├── snippet13.hs │ │ │ ├── snippet14.hs │ │ │ ├── snippet15.hs │ │ │ ├── snippet16.hs │ │ │ ├── snippet17.hs │ │ │ ├── snippet18.hs │ │ │ ├── snippet19.hs │ │ │ ├── snippet20.hs │ │ │ ├── snippet21.hs │ │ │ ├── snippet22.hs │ │ │ ├── snippet23.hs │ │ │ ├── snippet24.hs │ │ │ ├── snippet25.hs │ │ │ ├── snippet26.hs │ │ │ └── snippet27.hs │ │ ├── ocaml │ │ │ ├── snippet01.ml │ │ │ ├── snippet02.ml │ │ │ ├── snippet03.ml │ │ │ ├── snippet04.ml │ │ │ ├── snippet05.ml │ │ │ ├── snippet06.ml │ │ │ ├── snippet07.ml │ │ │ ├── snippet08.ml │ │ │ ├── snippet09.ml │ │ │ ├── snippet10.ml │ │ │ ├── snippet11.ml │ │ │ ├── snippet12.ml │ │ │ ├── snippet13.ml │ │ │ ├── snippet14.ml │ │ │ ├── snippet15.ml │ │ │ ├── snippet16.ml │ │ │ ├── snippet17.ml │ │ │ ├── snippet18.ml │ │ │ ├── snippet19.ml │ │ │ ├── snippet20.ml │ │ │ ├── snippet21.ml │ │ │ ├── snippet22.ml │ │ │ ├── snippet23.ml │ │ │ ├── snippet24.ml │ │ │ ├── snippet25.ml │ │ │ ├── snippet26.ml │ │ │ └── snippet27.ml │ │ ├── reason │ │ │ ├── snippet01.re │ │ │ ├── snippet02.re │ │ │ ├── snippet03.re │ │ │ ├── snippet04.re │ │ │ ├── snippet05.re │ │ │ ├── snippet06.re │ │ │ ├── snippet07.re │ │ │ ├── snippet08.re │ │ │ ├── snippet09.re │ │ │ ├── snippet10.re │ │ │ ├── snippet11.re │ │ │ ├── snippet12.re │ │ │ ├── snippet13.re │ │ │ ├── snippet14.re │ │ │ ├── snippet15.re │ │ │ ├── snippet16.re │ │ │ ├── snippet17.re │ │ │ ├── snippet18.re │ │ │ ├── snippet19.re │ │ │ ├── snippet20.re │ │ │ ├── snippet21.re │ │ │ ├── snippet22.re │ │ │ ├── snippet23.re │ │ │ ├── snippet24.re │ │ │ ├── snippet25.re │ │ │ ├── snippet26.re │ │ │ └── snippet27.re │ │ └── scala │ │ │ ├── snippet01.scala │ │ │ ├── snippet02.scala │ │ │ ├── snippet03.scala │ │ │ ├── snippet04.scala │ │ │ ├── snippet05.scala │ │ │ ├── snippet06.scala │ │ │ ├── snippet07.scala │ │ │ ├── snippet08.scala │ │ │ ├── snippet09.scala │ │ │ ├── snippet10.scala │ │ │ ├── snippet11.scala │ │ │ ├── snippet12.scala │ │ │ ├── snippet13.scala │ │ │ ├── snippet14.scala │ │ │ ├── snippet15.scala │ │ │ ├── snippet16.scala │ │ │ ├── snippet17.scala │ │ │ ├── snippet18.scala │ │ │ ├── snippet19.scala │ │ │ ├── snippet20.scala │ │ │ ├── snippet21.scala │ │ │ ├── snippet22.scala │ │ │ ├── snippet23.scala │ │ │ ├── snippet24.scala │ │ │ ├── snippet25.scala │ │ │ ├── snippet26.scala │ │ │ └── snippet27.scala │ ├── images │ │ ├── 10_horizontal.jpg │ │ ├── 1_functors.jpg │ │ ├── 2_natcomp.jpg │ │ ├── 3_naturality.jpg │ │ ├── 4_transport.jpg │ │ ├── 5_vertical.jpg │ │ ├── 6_verticalnaturality.jpg │ │ ├── 6a_vertical.jpg │ │ ├── 7_cathomset.jpg │ │ ├── 8_cat-2-cat.jpg │ │ ├── 9_horizontal.jpg │ │ ├── naturality.jpg │ │ └── sideways.jpg │ └── natural-transformations.tex ├── 1.2 │ ├── code │ │ ├── haskell │ │ │ ├── snippet01.hs │ │ │ ├── snippet02.hs │ │ │ ├── snippet03.hs │ │ │ ├── snippet04.hs │ │ │ ├── snippet05.hs │ │ │ ├── snippet06.hs │ │ │ ├── snippet07.hs │ │ │ ├── snippet08.hs │ │ │ ├── snippet09.hs │ │ │ ├── snippet10.hs │ │ │ └── snippet11.hs │ │ ├── ocaml │ │ │ ├── snippet01.ml │ │ │ ├── snippet010.ml │ │ │ ├── snippet011.ml │ │ │ ├── snippet02.ml │ │ │ ├── snippet03.ml │ │ │ ├── snippet04.ml │ │ │ ├── snippet05.ml │ │ │ ├── snippet06.ml │ │ │ ├── snippet07.ml │ │ │ ├── snippet08.ml │ │ │ ├── snippet09.ml │ │ │ ├── snippet10.ml │ │ │ └── snippet11.ml │ │ ├── reason │ │ │ ├── snippet01.re │ │ │ ├── snippet010.re │ │ │ ├── snippet011.re │ │ │ ├── snippet02.re │ │ │ ├── snippet03.re │ │ │ ├── snippet04.re │ │ │ ├── snippet05.re │ │ │ ├── snippet06.re │ │ │ ├── snippet07.re │ │ │ ├── snippet08.re │ │ │ ├── snippet09.re │ │ │ ├── snippet10.re │ │ │ └── snippet11.re │ │ └── scala │ │ │ ├── snippet01.scala │ │ │ ├── snippet02.scala │ │ │ ├── snippet03.scala │ │ │ ├── snippet04.scala │ │ │ ├── snippet05.scala │ │ │ ├── snippet06.scala │ │ │ ├── snippet07.scala │ │ │ ├── snippet08.scala │ │ │ ├── snippet09.scala │ │ │ ├── snippet10.scala │ │ │ └── snippet11.scala │ ├── images │ │ └── img_1329.jpg │ └── types-and-functions.tex ├── 1.3 │ ├── categories-great-and-small.tex │ ├── code │ │ ├── haskell │ │ │ ├── snippet01.hs │ │ │ └── snippet02.hs │ │ ├── ocaml │ │ │ ├── snippet01.ml │ │ │ └── snippet02.ml │ │ ├── reason │ │ │ ├── snippet01.re │ │ │ └── snippet02.re │ │ └── scala │ │ │ ├── snippet01.scala │ │ │ └── snippet02.scala │ └── images │ │ ├── monoid.jpg │ │ ├── monoid.png │ │ └── monoidhomset.jpg ├── 1.4 │ ├── code │ │ ├── haskell │ │ │ ├── snippet01.hs │ │ │ ├── snippet02.hs │ │ │ ├── snippet03.hs │ │ │ ├── snippet04.hs │ │ │ ├── snippet05.hs │ │ │ ├── snippet06.hs │ │ │ └── snippet07.hs │ │ ├── ocaml │ │ │ ├── snippet01.ml │ │ │ ├── snippet02.ml │ │ │ ├── snippet03.ml │ │ │ ├── snippet04.ml │ │ │ ├── snippet05.ml │ │ │ ├── snippet06.ml │ │ │ └── snippet07.ml │ │ ├── reason │ │ │ ├── snippet01.re │ │ │ ├── snippet02.re │ │ │ ├── snippet03.re │ │ │ ├── snippet04.re │ │ │ ├── snippet05.re │ │ │ ├── snippet06.re │ │ │ └── snippet07.re │ │ └── scala │ │ │ ├── snippet01.scala │ │ │ ├── snippet02.scala │ │ │ ├── snippet03.scala │ │ │ ├── snippet04.scala │ │ │ ├── snippet05.scala │ │ │ ├── snippet06.scala │ │ │ └── snippet07.scala │ ├── images │ │ └── piggyback.jpg │ └── kleisli-categories.tex ├── 1.5 │ ├── code │ │ ├── haskell │ │ │ ├── snippet01.hs │ │ │ ├── snippet02.hs │ │ │ ├── snippet03.hs │ │ │ ├── snippet04.hs │ │ │ ├── snippet05.hs │ │ │ ├── snippet06.hs │ │ │ ├── snippet07.hs │ │ │ ├── snippet08.hs │ │ │ ├── snippet09.hs │ │ │ ├── snippet10.hs │ │ │ ├── snippet11.hs │ │ │ ├── snippet12.hs │ │ │ ├── snippet13.hs │ │ │ ├── snippet14.hs │ │ │ ├── snippet15.hs │ │ │ ├── snippet16.hs │ │ │ ├── snippet17.hs │ │ │ ├── snippet18.hs │ │ │ ├── snippet19.hs │ │ │ ├── snippet20.hs │ │ │ ├── snippet21.hs │ │ │ ├── snippet22.hs │ │ │ ├── snippet23.hs │ │ │ ├── snippet24.hs │ │ │ ├── snippet25.hs │ │ │ ├── snippet26.hs │ │ │ ├── snippet27.hs │ │ │ └── snippet28.hs │ │ ├── ocaml │ │ │ ├── snippet01.ml │ │ │ ├── snippet02.ml │ │ │ ├── snippet03.ml │ │ │ ├── snippet04.ml │ │ │ ├── snippet05.ml │ │ │ ├── snippet06.ml │ │ │ ├── snippet07.ml │ │ │ ├── snippet08.ml │ │ │ ├── snippet09.ml │ │ │ ├── snippet10.ml │ │ │ ├── snippet11.ml │ │ │ ├── snippet12.ml │ │ │ ├── snippet13.ml │ │ │ ├── snippet14.ml │ │ │ ├── snippet15.ml │ │ │ ├── snippet16.ml │ │ │ ├── snippet17.ml │ │ │ ├── snippet18.ml │ │ │ ├── snippet19.ml │ │ │ ├── snippet20.ml │ │ │ ├── snippet21.ml │ │ │ ├── snippet22.ml │ │ │ ├── snippet23.ml │ │ │ ├── snippet24.ml │ │ │ ├── snippet25.ml │ │ │ ├── snippet26.ml │ │ │ ├── snippet27.ml │ │ │ └── snippet28.ml │ │ ├── reason │ │ │ ├── snippet01.re │ │ │ ├── snippet02.re │ │ │ ├── snippet03.re │ │ │ ├── snippet04.re │ │ │ ├── snippet05.re │ │ │ ├── snippet06.re │ │ │ ├── snippet07.re │ │ │ ├── snippet08.re │ │ │ ├── snippet09.re │ │ │ ├── snippet10.re │ │ │ ├── snippet11.re │ │ │ ├── snippet12.re │ │ │ ├── snippet13.re │ │ │ ├── snippet14.re │ │ │ ├── snippet15.re │ │ │ ├── snippet16.re │ │ │ ├── snippet17.re │ │ │ ├── snippet18.re │ │ │ ├── snippet19.re │ │ │ ├── snippet20.re │ │ │ ├── snippet21.re │ │ │ ├── snippet22.re │ │ │ ├── snippet23.re │ │ │ ├── snippet24.re │ │ │ ├── snippet25.re │ │ │ ├── snippet26.re │ │ │ ├── snippet27.re │ │ │ └── snippet28.re │ │ └── scala │ │ │ ├── snippet01.scala │ │ │ ├── snippet02.scala │ │ │ ├── snippet03.scala │ │ │ ├── snippet04.scala │ │ │ ├── snippet05.scala │ │ │ ├── snippet06.scala │ │ │ ├── snippet07.scala │ │ │ ├── snippet08.scala │ │ │ ├── snippet09.scala │ │ │ ├── snippet10.scala │ │ │ ├── snippet11.scala │ │ │ ├── snippet12.scala │ │ │ ├── snippet13.scala │ │ │ ├── snippet14.scala │ │ │ ├── snippet15.scala │ │ │ ├── snippet16.scala │ │ │ ├── snippet17.scala │ │ │ ├── snippet18.scala │ │ │ ├── snippet19.scala │ │ │ ├── snippet20.scala │ │ │ ├── snippet21.scala │ │ │ ├── snippet22.scala │ │ │ ├── snippet23.scala │ │ │ ├── snippet24.scala │ │ │ ├── snippet25.scala │ │ │ ├── snippet26.scala │ │ │ ├── snippet27.scala │ │ │ └── snippet28.scala │ ├── images │ │ ├── coproductpattern.jpg │ │ ├── coproductranking.jpg │ │ ├── final.jpg │ │ ├── initial.jpg │ │ ├── not-a-product.jpg │ │ ├── productcandidates.jpg │ │ ├── productpattern.jpg │ │ ├── productranking.jpg │ │ └── uniqueness.jpg │ └── products-and-coproducts.tex ├── 1.6 │ ├── code │ │ ├── haskell │ │ │ ├── snippet01.hs │ │ │ ├── snippet02.hs │ │ │ ├── snippet03.hs │ │ │ ├── snippet04.hs │ │ │ ├── snippet05.hs │ │ │ ├── snippet06.hs │ │ │ ├── snippet07.hs │ │ │ ├── snippet08.hs │ │ │ ├── snippet09.hs │ │ │ ├── snippet10.hs │ │ │ ├── snippet11.hs │ │ │ ├── snippet12.hs │ │ │ ├── snippet13.hs │ │ │ ├── snippet14.hs │ │ │ ├── snippet15.hs │ │ │ ├── snippet16.hs │ │ │ ├── snippet17.hs │ │ │ ├── snippet18.hs │ │ │ ├── snippet19.hs │ │ │ ├── snippet20.hs │ │ │ ├── snippet21.hs │ │ │ ├── snippet22.hs │ │ │ ├── snippet23.hs │ │ │ ├── snippet24.hs │ │ │ ├── snippet25.hs │ │ │ ├── snippet26.hs │ │ │ ├── snippet27.hs │ │ │ ├── snippet28.hs │ │ │ ├── snippet29.hs │ │ │ ├── snippet30.hs │ │ │ ├── snippet31.hs │ │ │ ├── snippet32.hs │ │ │ ├── snippet33.hs │ │ │ ├── snippet34.hs │ │ │ ├── snippet35.hs │ │ │ ├── snippet36.hs │ │ │ └── snippet37.hs │ │ ├── ocaml │ │ │ ├── snippet01.ml │ │ │ ├── snippet02.ml │ │ │ ├── snippet03.ml │ │ │ ├── snippet04.ml │ │ │ ├── snippet05.ml │ │ │ ├── snippet06.ml │ │ │ ├── snippet07.ml │ │ │ ├── snippet08.ml │ │ │ ├── snippet09.ml │ │ │ ├── snippet10.ml │ │ │ ├── snippet11.ml │ │ │ ├── snippet12.ml │ │ │ ├── snippet13.ml │ │ │ ├── snippet14.ml │ │ │ ├── snippet15.ml │ │ │ ├── snippet16.ml │ │ │ ├── snippet17.ml │ │ │ ├── snippet18.ml │ │ │ ├── snippet19.ml │ │ │ ├── snippet20.ml │ │ │ ├── snippet21.ml │ │ │ ├── snippet22.ml │ │ │ ├── snippet23.ml │ │ │ ├── snippet24.ml │ │ │ ├── snippet25.ml │ │ │ ├── snippet26.ml │ │ │ ├── snippet27.ml │ │ │ ├── snippet28.ml │ │ │ ├── snippet29.ml │ │ │ ├── snippet30.ml │ │ │ ├── snippet31.ml │ │ │ ├── snippet32.ml │ │ │ ├── snippet33.ml │ │ │ ├── snippet34.ml │ │ │ ├── snippet35.ml │ │ │ ├── snippet36.ml │ │ │ └── snippet37.ml │ │ ├── reason │ │ │ ├── snippet01.re │ │ │ ├── snippet02.re │ │ │ ├── snippet03.re │ │ │ ├── snippet04.re │ │ │ ├── snippet05.re │ │ │ ├── snippet06.re │ │ │ ├── snippet07.re │ │ │ ├── snippet08.re │ │ │ ├── snippet09.re │ │ │ ├── snippet10.re │ │ │ ├── snippet11.re │ │ │ ├── snippet12.re │ │ │ ├── snippet13.re │ │ │ ├── snippet14.re │ │ │ ├── snippet15.re │ │ │ ├── snippet16.re │ │ │ ├── snippet17.re │ │ │ ├── snippet18.re │ │ │ ├── snippet19.re │ │ │ ├── snippet20.re │ │ │ ├── snippet21.re │ │ │ ├── snippet22.re │ │ │ ├── snippet23.re │ │ │ ├── snippet24.re │ │ │ ├── snippet25.re │ │ │ ├── snippet26.re │ │ │ ├── snippet27.re │ │ │ ├── snippet28.re │ │ │ ├── snippet29.re │ │ │ ├── snippet30.re │ │ │ ├── snippet31.re │ │ │ ├── snippet32.re │ │ │ ├── snippet33.re │ │ │ ├── snippet34.re │ │ │ ├── snippet35.re │ │ │ ├── snippet36.re │ │ │ └── snippet37.re │ │ └── scala │ │ │ ├── snippet01.scala │ │ │ ├── snippet02.scala │ │ │ ├── snippet03.scala │ │ │ ├── snippet04.scala │ │ │ ├── snippet05.scala │ │ │ ├── snippet06.scala │ │ │ ├── snippet07.scala │ │ │ ├── snippet08.scala │ │ │ ├── snippet09.scala │ │ │ ├── snippet10.scala │ │ │ ├── snippet11.scala │ │ │ ├── snippet12.scala │ │ │ ├── snippet13.scala │ │ │ ├── snippet14.scala │ │ │ ├── snippet15.scala │ │ │ ├── snippet16.scala │ │ │ ├── snippet17.scala │ │ │ ├── snippet18.scala │ │ │ ├── snippet19.scala │ │ │ ├── snippet20.scala │ │ │ ├── snippet21.scala │ │ │ ├── snippet22.scala │ │ │ ├── snippet23.scala │ │ │ ├── snippet24.scala │ │ │ ├── snippet25.scala │ │ │ ├── snippet26.scala │ │ │ ├── snippet27.scala │ │ │ ├── snippet28.scala │ │ │ ├── snippet29.scala │ │ │ ├── snippet30.scala │ │ │ ├── snippet31.scala │ │ │ ├── snippet32.scala │ │ │ ├── snippet33.scala │ │ │ ├── snippet34.scala │ │ │ ├── snippet35.scala │ │ │ ├── snippet36.scala │ │ │ └── snippet37.scala │ ├── images │ │ └── pair.jpg │ └── simple-algebraic-data-types.tex ├── 1.7 │ ├── code │ │ ├── haskell │ │ │ ├── snippet01.hs │ │ │ ├── snippet02.hs │ │ │ ├── snippet03.hs │ │ │ ├── snippet04.hs │ │ │ ├── snippet05.hs │ │ │ ├── snippet06.hs │ │ │ ├── snippet07.hs │ │ │ ├── snippet08.hs │ │ │ ├── snippet09.hs │ │ │ ├── snippet10.hs │ │ │ ├── snippet11.hs │ │ │ ├── snippet12.hs │ │ │ ├── snippet13.hs │ │ │ ├── snippet14.hs │ │ │ ├── snippet15.hs │ │ │ ├── snippet16.hs │ │ │ ├── snippet17.hs │ │ │ ├── snippet18.hs │ │ │ ├── snippet19.hs │ │ │ ├── snippet20.hs │ │ │ ├── snippet21.hs │ │ │ ├── snippet22.hs │ │ │ ├── snippet23.hs │ │ │ ├── snippet24.hs │ │ │ ├── snippet25.hs │ │ │ ├── snippet26.hs │ │ │ ├── snippet27.hs │ │ │ ├── snippet28.hs │ │ │ ├── snippet29.hs │ │ │ ├── snippet30.hs │ │ │ ├── snippet31.hs │ │ │ ├── snippet32.hs │ │ │ ├── snippet33.hs │ │ │ ├── snippet34.hs │ │ │ └── snippet35.hs │ │ ├── ocaml │ │ │ ├── snippet01.ml │ │ │ ├── snippet02.ml │ │ │ ├── snippet03.ml │ │ │ ├── snippet04.ml │ │ │ ├── snippet05.ml │ │ │ ├── snippet06.ml │ │ │ ├── snippet07.ml │ │ │ ├── snippet08.ml │ │ │ ├── snippet09.ml │ │ │ ├── snippet10.ml │ │ │ ├── snippet11.ml │ │ │ ├── snippet12.ml │ │ │ ├── snippet13.ml │ │ │ ├── snippet14.ml │ │ │ ├── snippet15.ml │ │ │ ├── snippet16.ml │ │ │ ├── snippet17.ml │ │ │ ├── snippet18.ml │ │ │ ├── snippet19.ml │ │ │ ├── snippet20.ml │ │ │ ├── snippet21.ml │ │ │ ├── snippet22.ml │ │ │ ├── snippet23.ml │ │ │ ├── snippet24.ml │ │ │ ├── snippet25.ml │ │ │ ├── snippet26.ml │ │ │ ├── snippet27.ml │ │ │ ├── snippet28.ml │ │ │ ├── snippet29.ml │ │ │ ├── snippet30.ml │ │ │ ├── snippet31.ml │ │ │ ├── snippet32.ml │ │ │ ├── snippet33.ml │ │ │ ├── snippet34.ml │ │ │ └── snippet35.ml │ │ ├── reason │ │ │ ├── snippet01.re │ │ │ ├── snippet02.re │ │ │ ├── snippet03.re │ │ │ ├── snippet04.re │ │ │ ├── snippet05.re │ │ │ ├── snippet06.re │ │ │ ├── snippet07.re │ │ │ ├── snippet08.re │ │ │ ├── snippet09.re │ │ │ ├── snippet10.re │ │ │ ├── snippet11.re │ │ │ ├── snippet12.re │ │ │ ├── snippet13.re │ │ │ ├── snippet14.re │ │ │ ├── snippet15.re │ │ │ ├── snippet16.re │ │ │ ├── snippet17.re │ │ │ ├── snippet18.re │ │ │ ├── snippet19.re │ │ │ ├── snippet20.re │ │ │ ├── snippet21.re │ │ │ ├── snippet22.re │ │ │ ├── snippet23.re │ │ │ ├── snippet24.re │ │ │ ├── snippet25.re │ │ │ ├── snippet26.re │ │ │ ├── snippet27.re │ │ │ ├── snippet28.re │ │ │ ├── snippet29.re │ │ │ ├── snippet30.re │ │ │ ├── snippet31.re │ │ │ ├── snippet32.re │ │ │ ├── snippet33.re │ │ │ ├── snippet34.re │ │ │ └── snippet35.re │ │ └── scala │ │ │ ├── snippet01.scala │ │ │ ├── snippet02.scala │ │ │ ├── snippet03.scala │ │ │ ├── snippet04.scala │ │ │ ├── snippet05.scala │ │ │ ├── snippet06.scala │ │ │ ├── snippet07.scala │ │ │ ├── snippet08.scala │ │ │ ├── snippet09.scala │ │ │ ├── snippet10.scala │ │ │ ├── snippet11.scala │ │ │ ├── snippet12.scala │ │ │ ├── snippet13.scala │ │ │ ├── snippet14.scala │ │ │ ├── snippet15.scala │ │ │ ├── snippet16.scala │ │ │ ├── snippet17.scala │ │ │ ├── snippet18.scala │ │ │ ├── snippet19.scala │ │ │ ├── snippet20.scala │ │ │ ├── snippet21.scala │ │ │ ├── snippet22.scala │ │ │ ├── snippet23.scala │ │ │ ├── snippet24.scala │ │ │ ├── snippet25.scala │ │ │ ├── snippet26.scala │ │ │ ├── snippet27.scala │ │ │ ├── snippet28.scala │ │ │ ├── snippet29.scala │ │ │ ├── snippet30.scala │ │ │ ├── snippet31.scala │ │ │ ├── snippet32.scala │ │ │ ├── snippet33.scala │ │ │ ├── snippet34.scala │ │ │ └── snippet35.scala │ ├── functors.tex │ └── images │ │ ├── functor.jpg │ │ ├── functorcompos.jpg │ │ ├── functorid.jpg │ │ └── functormaybe.jpg ├── 1.8 │ ├── code │ │ ├── haskell │ │ │ ├── snippet01.hs │ │ │ ├── snippet02.hs │ │ │ ├── snippet03.hs │ │ │ ├── snippet04.hs │ │ │ ├── snippet05.hs │ │ │ ├── snippet06.hs │ │ │ ├── snippet07.hs │ │ │ ├── snippet08.hs │ │ │ ├── snippet09.hs │ │ │ ├── snippet10.hs │ │ │ ├── snippet11.hs │ │ │ ├── snippet12.hs │ │ │ ├── snippet13.hs │ │ │ ├── snippet14.hs │ │ │ ├── snippet15.hs │ │ │ ├── snippet16.hs │ │ │ ├── snippet17.hs │ │ │ ├── snippet18.hs │ │ │ ├── snippet19.hs │ │ │ ├── snippet20.hs │ │ │ ├── snippet21.hs │ │ │ ├── snippet22.hs │ │ │ ├── snippet23.hs │ │ │ ├── snippet24.hs │ │ │ ├── snippet25.hs │ │ │ ├── snippet26.hs │ │ │ ├── snippet27.hs │ │ │ ├── snippet28.hs │ │ │ ├── snippet29.hs │ │ │ └── snippet30.hs │ │ ├── ocaml │ │ │ ├── snippet01.ml │ │ │ ├── snippet02.ml │ │ │ ├── snippet03.ml │ │ │ ├── snippet04.ml │ │ │ ├── snippet05.ml │ │ │ ├── snippet06.ml │ │ │ ├── snippet07.ml │ │ │ ├── snippet08.ml │ │ │ ├── snippet09.ml │ │ │ ├── snippet10.ml │ │ │ ├── snippet11.ml │ │ │ ├── snippet12.ml │ │ │ ├── snippet13.ml │ │ │ ├── snippet14.ml │ │ │ ├── snippet15.ml │ │ │ ├── snippet16.ml │ │ │ ├── snippet17.ml │ │ │ ├── snippet18.ml │ │ │ ├── snippet19.ml │ │ │ ├── snippet20.ml │ │ │ ├── snippet21.ml │ │ │ ├── snippet22.ml │ │ │ ├── snippet23.ml │ │ │ ├── snippet24.ml │ │ │ ├── snippet25.ml │ │ │ ├── snippet26.ml │ │ │ ├── snippet27.ml │ │ │ ├── snippet28.ml │ │ │ ├── snippet29.ml │ │ │ └── snippet30.ml │ │ ├── reason │ │ │ ├── snippet01.re │ │ │ ├── snippet02.re │ │ │ ├── snippet03.re │ │ │ ├── snippet04.re │ │ │ ├── snippet05.re │ │ │ ├── snippet06.re │ │ │ ├── snippet07.re │ │ │ ├── snippet08.re │ │ │ ├── snippet09.re │ │ │ ├── snippet10.re │ │ │ ├── snippet11.re │ │ │ ├── snippet12.re │ │ │ ├── snippet13.re │ │ │ ├── snippet14.re │ │ │ ├── snippet15.re │ │ │ ├── snippet16.re │ │ │ ├── snippet17.re │ │ │ ├── snippet18.re │ │ │ ├── snippet19.re │ │ │ ├── snippet20.re │ │ │ ├── snippet21.re │ │ │ ├── snippet22.re │ │ │ ├── snippet23.re │ │ │ ├── snippet24.re │ │ │ ├── snippet25.re │ │ │ ├── snippet26.re │ │ │ ├── snippet27.re │ │ │ ├── snippet28.re │ │ │ ├── snippet29.re │ │ │ └── snippet30.re │ │ └── scala │ │ │ ├── snippet01.scala │ │ │ ├── snippet02.scala │ │ │ ├── snippet03.scala │ │ │ ├── snippet04.scala │ │ │ ├── snippet05.scala │ │ │ ├── snippet06.scala │ │ │ ├── snippet07.scala │ │ │ ├── snippet08.scala │ │ │ ├── snippet09.scala │ │ │ ├── snippet10.scala │ │ │ ├── snippet11.scala │ │ │ ├── snippet12.scala │ │ │ ├── snippet13.scala │ │ │ ├── snippet14.scala │ │ │ ├── snippet15.scala │ │ │ ├── snippet16.scala │ │ │ ├── snippet17.scala │ │ │ ├── snippet18.scala │ │ │ ├── snippet19.scala │ │ │ ├── snippet20.scala │ │ │ ├── snippet21.scala │ │ │ ├── snippet22.scala │ │ │ ├── snippet23.scala │ │ │ ├── snippet24.scala │ │ │ ├── snippet25.scala │ │ │ ├── snippet26.scala │ │ │ ├── snippet27.scala │ │ │ ├── snippet28.scala │ │ │ ├── snippet29.scala │ │ │ └── snippet30.scala │ ├── functoriality.tex │ └── images │ │ ├── bifunctor.jpg │ │ ├── bimap.jpg │ │ ├── contravariant.jpg │ │ ├── dimap.jpg │ │ ├── first.jpg │ │ └── second.jpg ├── 1.9 │ ├── code │ │ ├── haskell │ │ │ ├── snippet01.hs │ │ │ ├── snippet02.hs │ │ │ ├── snippet03.hs │ │ │ ├── snippet04.hs │ │ │ ├── snippet05.hs │ │ │ ├── snippet06.hs │ │ │ ├── snippet07.hs │ │ │ ├── snippet08.hs │ │ │ ├── snippet09.hs │ │ │ ├── snippet10.hs │ │ │ ├── snippet11.hs │ │ │ ├── snippet12.hs │ │ │ ├── snippet13.hs │ │ │ ├── snippet14.hs │ │ │ └── snippet15.hs │ │ ├── ocaml │ │ │ ├── snippet01.ml │ │ │ ├── snippet02.ml │ │ │ ├── snippet03.ml │ │ │ ├── snippet04.ml │ │ │ ├── snippet05.ml │ │ │ ├── snippet06.ml │ │ │ ├── snippet07.ml │ │ │ ├── snippet08.ml │ │ │ ├── snippet09.ml │ │ │ ├── snippet10.ml │ │ │ ├── snippet11.ml │ │ │ ├── snippet12.ml │ │ │ ├── snippet13.ml │ │ │ ├── snippet14.ml │ │ │ └── snippet15.ml │ │ ├── reason │ │ │ ├── snippet01.re │ │ │ ├── snippet02.re │ │ │ ├── snippet03.re │ │ │ ├── snippet04.re │ │ │ ├── snippet05.re │ │ │ ├── snippet06.re │ │ │ ├── snippet07.re │ │ │ ├── snippet08.re │ │ │ ├── snippet09.re │ │ │ ├── snippet10.re │ │ │ ├── snippet11.re │ │ │ ├── snippet12.re │ │ │ ├── snippet13.re │ │ │ ├── snippet14.re │ │ │ └── snippet15.re │ │ └── scala │ │ │ ├── snippet01.scala │ │ │ ├── snippet02.scala │ │ │ ├── snippet03.scala │ │ │ ├── snippet04.scala │ │ │ ├── snippet05.scala │ │ │ ├── snippet06.scala │ │ │ ├── snippet07.scala │ │ │ ├── snippet08.scala │ │ │ ├── snippet09.scala │ │ │ ├── snippet10.scala │ │ │ ├── snippet11.scala │ │ │ ├── snippet12.scala │ │ │ ├── snippet13.scala │ │ │ ├── snippet14.scala │ │ │ └── snippet15.scala │ ├── function-types.tex │ └── images │ │ ├── functionpattern.jpg │ │ ├── functionranking.jpg │ │ ├── functionset.jpg │ │ ├── hom-set.jpg │ │ ├── set-hom-set.jpg │ │ └── universalfunctionobject.jpg ├── 2.1 │ ├── code │ │ ├── haskell │ │ │ ├── snippet01.hs │ │ │ └── snippet02.hs │ │ ├── ocaml │ │ │ ├── snippet01.ml │ │ │ └── snippet02.ml │ │ ├── reason │ │ │ ├── snippet01.re │ │ │ └── snippet02.re │ │ └── scala │ │ │ ├── snippet01.scala │ │ │ └── snippet02.scala │ ├── declarative-programming.tex │ └── images │ │ ├── asteroids.png │ │ ├── feynman.jpg │ │ ├── mortar.jpg │ │ ├── productranking.jpg │ │ └── snell.jpg ├── 2.2 │ ├── code │ │ ├── haskell │ │ │ ├── snippet01.hs │ │ │ ├── snippet02.hs │ │ │ ├── snippet03.hs │ │ │ ├── snippet04.hs │ │ │ ├── snippet05.hs │ │ │ ├── snippet06.hs │ │ │ ├── snippet07.hs │ │ │ ├── snippet08.hs │ │ │ ├── snippet09.hs │ │ │ ├── snippet10.hs │ │ │ ├── snippet11.hs │ │ │ ├── snippet12.hs │ │ │ ├── snippet13.hs │ │ │ ├── snippet14.hs │ │ │ ├── snippet15.hs │ │ │ ├── snippet16.hs │ │ │ ├── snippet17.hs │ │ │ ├── snippet18.hs │ │ │ └── snippet19.hs │ │ ├── ocaml │ │ │ ├── snippet01.ml │ │ │ ├── snippet02.ml │ │ │ ├── snippet03.ml │ │ │ ├── snippet04.ml │ │ │ ├── snippet05.ml │ │ │ ├── snippet06.ml │ │ │ ├── snippet07.ml │ │ │ ├── snippet08.ml │ │ │ ├── snippet09.ml │ │ │ ├── snippet10.ml │ │ │ ├── snippet11.ml │ │ │ ├── snippet12.ml │ │ │ ├── snippet13.ml │ │ │ ├── snippet14.ml │ │ │ ├── snippet15.ml │ │ │ ├── snippet16.ml │ │ │ ├── snippet17.ml │ │ │ ├── snippet18.ml │ │ │ └── snippet19.ml │ │ ├── reason │ │ │ ├── snippet01.re │ │ │ ├── snippet02.re │ │ │ ├── snippet03.re │ │ │ ├── snippet04.re │ │ │ ├── snippet05.re │ │ │ ├── snippet06.re │ │ │ ├── snippet07.re │ │ │ ├── snippet08.re │ │ │ ├── snippet09.re │ │ │ ├── snippet10.re │ │ │ ├── snippet11.re │ │ │ ├── snippet12.re │ │ │ ├── snippet13.re │ │ │ ├── snippet14.re │ │ │ ├── snippet15.re │ │ │ ├── snippet16.re │ │ │ ├── snippet17.re │ │ │ ├── snippet18.re │ │ │ └── snippet19.re │ │ └── scala │ │ │ ├── snippet01.scala │ │ │ ├── snippet02.scala │ │ │ ├── snippet03.scala │ │ │ ├── snippet04.scala │ │ │ ├── snippet05.scala │ │ │ ├── snippet06.scala │ │ │ ├── snippet07.scala │ │ │ ├── snippet08.scala │ │ │ ├── snippet09.scala │ │ │ ├── snippet10.scala │ │ │ ├── snippet11.scala │ │ │ ├── snippet12.scala │ │ │ ├── snippet13.scala │ │ │ ├── snippet14.scala │ │ │ ├── snippet15.scala │ │ │ ├── snippet16.scala │ │ │ ├── snippet17.scala │ │ │ ├── snippet18.scala │ │ │ └── snippet19.scala │ ├── images │ │ ├── classes.jpg │ │ ├── colimit.jpg │ │ ├── cone.jpg │ │ ├── conecommutativity.jpg │ │ ├── conenaturality.jpg │ │ ├── continuity.jpg │ │ ├── coproductranking.jpg │ │ ├── equalizercone.jpg │ │ ├── equilizerlimit.jpg │ │ ├── homsetmapping.jpg │ │ ├── natmapping.jpg │ │ ├── productcone.jpg │ │ ├── productpattern.jpg │ │ ├── productranking.jpg │ │ ├── pullbackcone.jpg │ │ ├── pullbacklimit.jpg │ │ ├── two.jpg │ │ └── twodelta.jpg │ └── limits-and-colimits.tex ├── 2.3 │ ├── code │ │ ├── haskell │ │ │ ├── snippet01.hs │ │ │ ├── snippet02.hs │ │ │ ├── snippet03.hs │ │ │ ├── snippet04.hs │ │ │ ├── snippet05.hs │ │ │ ├── snippet06.hs │ │ │ ├── snippet07.hs │ │ │ ├── snippet08.hs │ │ │ ├── snippet09.hs │ │ │ └── snippet10.hs │ │ ├── ocaml │ │ │ ├── snippet01.ml │ │ │ ├── snippet02.ml │ │ │ ├── snippet03.ml │ │ │ ├── snippet04.ml │ │ │ ├── snippet05.ml │ │ │ ├── snippet06.ml │ │ │ ├── snippet07.ml │ │ │ ├── snippet08.ml │ │ │ ├── snippet09.ml │ │ │ └── snippet10.ml │ │ ├── reason │ │ │ ├── snippet01.re │ │ │ ├── snippet02.re │ │ │ ├── snippet03.re │ │ │ ├── snippet04.re │ │ │ ├── snippet05.re │ │ │ ├── snippet06.re │ │ │ ├── snippet07.re │ │ │ ├── snippet08.re │ │ │ ├── snippet09.re │ │ │ └── snippet10.re │ │ └── scala │ │ │ ├── snippet01.scala │ │ │ ├── snippet02.scala │ │ │ ├── snippet03.scala │ │ │ ├── snippet04.scala │ │ │ ├── snippet05.scala │ │ │ ├── snippet06.scala │ │ │ ├── snippet07.scala │ │ │ ├── snippet08.scala │ │ │ ├── snippet09.scala │ │ │ └── snippet10.scala │ ├── free-monoids.tex │ └── images │ │ ├── bunnies.jpg │ │ ├── monoid-pattern.jpg │ │ └── monoid-ranking.jpg ├── 2.4 │ ├── code │ │ ├── haskell │ │ │ ├── snippet01.hs │ │ │ ├── snippet02.hs │ │ │ ├── snippet03.hs │ │ │ ├── snippet04.hs │ │ │ ├── snippet05.hs │ │ │ ├── snippet06.hs │ │ │ ├── snippet07.hs │ │ │ ├── snippet08.hs │ │ │ ├── snippet09.hs │ │ │ ├── snippet10.hs │ │ │ ├── snippet11.hs │ │ │ ├── snippet12.hs │ │ │ ├── snippet13.hs │ │ │ ├── snippet14.hs │ │ │ └── snippet15.hs │ │ ├── ocaml │ │ │ ├── snippet01.ml │ │ │ ├── snippet02.ml │ │ │ ├── snippet03.ml │ │ │ ├── snippet04.ml │ │ │ ├── snippet05.ml │ │ │ ├── snippet06.ml │ │ │ ├── snippet07.ml │ │ │ ├── snippet08.ml │ │ │ ├── snippet09.ml │ │ │ ├── snippet10.ml │ │ │ ├── snippet11.ml │ │ │ ├── snippet12.ml │ │ │ ├── snippet13.ml │ │ │ ├── snippet14.ml │ │ │ └── snippet15.ml │ │ ├── reason │ │ │ ├── snippet01.re │ │ │ ├── snippet02.re │ │ │ ├── snippet03.re │ │ │ ├── snippet04.re │ │ │ ├── snippet05.re │ │ │ ├── snippet06.re │ │ │ ├── snippet07.re │ │ │ ├── snippet08.re │ │ │ ├── snippet09.re │ │ │ ├── snippet10.re │ │ │ ├── snippet11.re │ │ │ ├── snippet12.re │ │ │ ├── snippet13.re │ │ │ ├── snippet14.re │ │ │ └── snippet15.re │ │ └── scala │ │ │ ├── snippet01.scala │ │ │ ├── snippet02.scala │ │ │ ├── snippet03.scala │ │ │ ├── snippet04.scala │ │ │ ├── snippet05.scala │ │ │ ├── snippet06.scala │ │ │ ├── snippet07.scala │ │ │ ├── snippet08.scala │ │ │ ├── snippet09.scala │ │ │ ├── snippet10.scala │ │ │ ├── snippet11.scala │ │ │ ├── snippet12.scala │ │ │ ├── snippet13.scala │ │ │ ├── snippet14.scala │ │ │ └── snippet15.scala │ ├── images │ │ ├── hom-functor.jpg │ │ └── hom-set.jpg │ └── representable-functors.tex ├── 2.5 │ ├── code │ │ ├── haskell │ │ │ ├── snippet01.hs │ │ │ ├── snippet02.hs │ │ │ ├── snippet03.hs │ │ │ ├── snippet04.hs │ │ │ ├── snippet05.hs │ │ │ ├── snippet06.hs │ │ │ └── snippet07.hs │ │ ├── ocaml │ │ │ ├── snippet01.ml │ │ │ ├── snippet02.ml │ │ │ ├── snippet03.ml │ │ │ ├── snippet04.ml │ │ │ ├── snippet05.ml │ │ │ ├── snippet06.ml │ │ │ └── snippet07.ml │ │ ├── reason │ │ │ ├── snippet01.re │ │ │ ├── snippet02.re │ │ │ ├── snippet03.re │ │ │ ├── snippet04.re │ │ │ ├── snippet05.re │ │ │ ├── snippet06.re │ │ │ └── snippet07.re │ │ └── scala │ │ │ ├── snippet01.scala │ │ │ ├── snippet02.scala │ │ │ ├── snippet03.scala │ │ │ ├── snippet04.scala │ │ │ ├── snippet05.scala │ │ │ ├── snippet06.scala │ │ │ └── snippet07.scala │ ├── images │ │ ├── yoneda1.png │ │ ├── yoneda2.png │ │ ├── yoneda3.png │ │ ├── yoneda4.png │ │ └── yoneda5.png │ └── the-yoneda-lemma.tex ├── 2.6 │ ├── code │ │ ├── haskell │ │ │ ├── snippet01.hs │ │ │ └── snippet02.hs │ │ ├── ocaml │ │ │ ├── snippet01.ml │ │ │ └── snippet02.ml │ │ ├── reason │ │ │ ├── snippet01.re │ │ │ └── snippet02.re │ │ └── scala │ │ │ ├── snippet01.scala │ │ │ └── snippet02.scala │ ├── images │ │ ├── yoneda-embedding-2.jpg │ │ └── yoneda-embedding.jpg │ └── yoneda-embedding.tex ├── 3.1 │ ├── images │ │ ├── 3_naturality.jpg │ │ ├── productranking.jpg │ │ └── sheets.png │ └── its-all-about-morphisms.tex ├── 3.10 │ ├── code │ │ ├── haskell │ │ │ ├── snippet01.hs │ │ │ ├── snippet02.hs │ │ │ ├── snippet03.hs │ │ │ ├── snippet04.hs │ │ │ ├── snippet05.hs │ │ │ ├── snippet06.hs │ │ │ ├── snippet07.hs │ │ │ ├── snippet08.hs │ │ │ ├── snippet09.hs │ │ │ ├── snippet10.hs │ │ │ ├── snippet11.hs │ │ │ ├── snippet12.hs │ │ │ ├── snippet13.hs │ │ │ ├── snippet14.hs │ │ │ ├── snippet15.hs │ │ │ ├── snippet16.hs │ │ │ ├── snippet17.hs │ │ │ └── snippet18.hs │ │ ├── ocaml │ │ │ ├── snippet01.ml │ │ │ ├── snippet02.ml │ │ │ ├── snippet03.ml │ │ │ ├── snippet04.ml │ │ │ ├── snippet05.ml │ │ │ ├── snippet06.ml │ │ │ ├── snippet07.ml │ │ │ ├── snippet08.ml │ │ │ ├── snippet09.ml │ │ │ ├── snippet10.ml │ │ │ ├── snippet11.ml │ │ │ ├── snippet12.ml │ │ │ ├── snippet13.ml │ │ │ ├── snippet14.ml │ │ │ ├── snippet15.ml │ │ │ ├── snippet16.ml │ │ │ ├── snippet17.ml │ │ │ └── snippet18.ml │ │ ├── reason │ │ │ ├── snippet01.re │ │ │ ├── snippet02.re │ │ │ ├── snippet03.re │ │ │ ├── snippet04.re │ │ │ ├── snippet05.re │ │ │ ├── snippet06.re │ │ │ ├── snippet07.re │ │ │ ├── snippet08.re │ │ │ ├── snippet09.re │ │ │ ├── snippet10.re │ │ │ ├── snippet11.re │ │ │ ├── snippet12.re │ │ │ ├── snippet13.re │ │ │ ├── snippet14.re │ │ │ ├── snippet15.re │ │ │ ├── snippet16.re │ │ │ ├── snippet17.re │ │ │ └── snippet18.re │ │ └── scala │ │ │ ├── snippet01.scala │ │ │ ├── snippet02.scala │ │ │ ├── snippet03.scala │ │ │ ├── snippet04.scala │ │ │ ├── snippet05.scala │ │ │ ├── snippet06.scala │ │ │ ├── snippet07.scala │ │ │ ├── snippet08.scala │ │ │ ├── snippet09.scala │ │ │ ├── snippet10.scala │ │ │ ├── snippet11.scala │ │ │ ├── snippet12.scala │ │ │ ├── snippet13.scala │ │ │ ├── snippet14.scala │ │ │ ├── snippet15.scala │ │ │ ├── snippet16.scala │ │ │ ├── snippet17.scala │ │ │ └── snippet18.scala │ ├── ends-and-coends.tex │ └── images │ │ ├── end-1.jpg │ │ ├── end-2.jpg │ │ ├── end-21.jpg │ │ ├── end-31.jpg │ │ ├── end.jpg │ │ └── end1.jpg ├── 3.11 │ ├── code │ │ ├── haskell │ │ │ ├── snippet01.hs │ │ │ ├── snippet02.hs │ │ │ ├── snippet03.hs │ │ │ ├── snippet04.hs │ │ │ ├── snippet05.hs │ │ │ ├── snippet06.hs │ │ │ ├── snippet07.hs │ │ │ ├── snippet08.hs │ │ │ ├── snippet09.hs │ │ │ ├── snippet10.hs │ │ │ ├── snippet11.hs │ │ │ └── snippet12.hs │ │ ├── ocaml │ │ │ ├── snippet01.ml │ │ │ ├── snippet02.ml │ │ │ ├── snippet03.ml │ │ │ ├── snippet04.ml │ │ │ ├── snippet05.ml │ │ │ ├── snippet06.ml │ │ │ ├── snippet07.ml │ │ │ ├── snippet08.ml │ │ │ ├── snippet09.ml │ │ │ ├── snippet10.ml │ │ │ ├── snippet11.ml │ │ │ └── snippet12.ml │ │ ├── reason │ │ │ ├── snippet01.re │ │ │ ├── snippet02.re │ │ │ ├── snippet03.re │ │ │ ├── snippet04.re │ │ │ ├── snippet05.re │ │ │ ├── snippet06.re │ │ │ ├── snippet07.re │ │ │ ├── snippet08.re │ │ │ ├── snippet09.re │ │ │ ├── snippet10.re │ │ │ ├── snippet11.re │ │ │ └── snippet12.re │ │ └── scala │ │ │ ├── snippet01.scala │ │ │ ├── snippet02.scala │ │ │ ├── snippet03.scala │ │ │ ├── snippet04.scala │ │ │ ├── snippet05.scala │ │ │ ├── snippet06.scala │ │ │ ├── snippet07.scala │ │ │ ├── snippet08.scala │ │ │ ├── snippet09.scala │ │ │ ├── snippet10.scala │ │ │ ├── snippet11.scala │ │ │ └── snippet12.scala │ ├── images │ │ ├── kan10a.jpg │ │ ├── kan10b.jpg │ │ ├── kan112.jpg │ │ ├── kan12.jpg │ │ ├── kan13.jpg │ │ ├── kan14.jpg │ │ ├── kan15.jpg │ │ ├── kan2.jpg │ │ ├── kan3-e1492120491591.jpg │ │ ├── kan31-e1492120512209.jpg │ │ ├── kan5.jpg │ │ ├── kan6.jpg │ │ ├── kan7.jpg │ │ ├── kan81.jpg │ │ └── kan92.jpg │ └── kan-extensions.tex ├── 3.12 │ ├── enriched-categories.tex │ └── images │ │ ├── composition.jpg │ │ └── id.jpg ├── 3.13 │ ├── images │ │ ├── monomorphism.jpg │ │ ├── notmono.jpg │ │ ├── pullback.jpg │ │ ├── subsetinjection.jpg │ │ └── true.jpg │ └── topoi.tex ├── 3.14 │ ├── code │ │ ├── haskell │ │ │ ├── snippet01.hs │ │ │ ├── snippet02.hs │ │ │ ├── snippet03.hs │ │ │ └── snippet04.hs │ │ ├── ocaml │ │ │ ├── snippet01.ml │ │ │ ├── snippet02.ml │ │ │ ├── snippet03.ml │ │ │ └── snippet04.ml │ │ ├── reason │ │ │ ├── snippet01.re │ │ │ ├── snippet02.re │ │ │ ├── snippet03.re │ │ │ └── snippet04.re │ │ └── scala │ │ │ ├── snippet01.scala │ │ │ ├── snippet02.scala │ │ │ ├── snippet03.scala │ │ │ └── snippet04.scala │ ├── images │ │ ├── lawvere1.png │ │ └── liftpower.png │ └── lawvere-theories.tex ├── 3.15 │ ├── images │ │ ├── bicat.png │ │ ├── bimonad.png │ │ ├── compspan.png │ │ ├── monad.png │ │ ├── morphspan.png │ │ ├── pullspan.png │ │ ├── span.png │ │ ├── spanmonad.png │ │ ├── spanmul.png │ │ ├── spanunit.png │ │ └── twocat.png │ └── monads-monoids-and-categories.tex ├── 3.2 │ ├── adjunctions.tex │ ├── code │ │ ├── haskell │ │ │ ├── snippet01.hs │ │ │ ├── snippet02.hs │ │ │ ├── snippet03.hs │ │ │ ├── snippet04.hs │ │ │ ├── snippet05.hs │ │ │ ├── snippet06.hs │ │ │ ├── snippet07.hs │ │ │ ├── snippet08.hs │ │ │ └── snippet09.hs │ │ ├── ocaml │ │ │ ├── snippet01.ml │ │ │ ├── snippet02.ml │ │ │ ├── snippet03.ml │ │ │ ├── snippet04.ml │ │ │ ├── snippet05.ml │ │ │ ├── snippet06.ml │ │ │ ├── snippet07.ml │ │ │ ├── snippet08.ml │ │ │ └── snippet09.ml │ │ ├── reason │ │ │ ├── snippet01.re │ │ │ ├── snippet02.re │ │ │ ├── snippet03.re │ │ │ ├── snippet04.re │ │ │ ├── snippet05.re │ │ │ ├── snippet06.re │ │ │ ├── snippet07.re │ │ │ ├── snippet08.re │ │ │ └── snippet09.re │ │ └── scala │ │ │ ├── snippet01.scala │ │ │ ├── snippet02.scala │ │ │ ├── snippet03.scala │ │ │ ├── snippet04.scala │ │ │ ├── snippet05.scala │ │ │ ├── snippet06.scala │ │ │ ├── snippet07.scala │ │ │ ├── snippet08.scala │ │ │ └── snippet09.scala │ └── images │ │ ├── adj-1.jpg │ │ ├── adj-counit.jpg │ │ ├── adj-expo.jpg │ │ ├── adj-homsets.jpg │ │ ├── adj-product.jpg │ │ ├── adj-productcat.jpg │ │ └── adj-unit.jpg ├── 3.3 │ ├── code │ │ ├── haskell │ │ │ ├── snippet01.hs │ │ │ └── snippet02.hs │ │ ├── ocaml │ │ │ ├── snippet01.ml │ │ │ └── snippet02.ml │ │ ├── reason │ │ │ ├── snippet01.re │ │ │ └── snippet02.re │ │ └── scala │ │ │ ├── snippet01.scala │ │ │ └── snippet02.scala │ ├── free-forgetful-adjunctions.tex │ └── images │ │ ├── forgetful.jpg │ │ ├── forgettingmorphisms.jpg │ │ ├── freeimage.jpg │ │ └── freemonadjunction.jpg ├── 3.4 │ ├── code │ │ ├── haskell │ │ │ ├── snippet01.hs │ │ │ ├── snippet02.hs │ │ │ ├── snippet03.hs │ │ │ ├── snippet04.hs │ │ │ ├── snippet05.hs │ │ │ ├── snippet06.hs │ │ │ ├── snippet07.hs │ │ │ ├── snippet08.hs │ │ │ ├── snippet09.hs │ │ │ ├── snippet10.hs │ │ │ ├── snippet11.hs │ │ │ ├── snippet12.hs │ │ │ ├── snippet13.hs │ │ │ ├── snippet14.hs │ │ │ ├── snippet15.hs │ │ │ ├── snippet16.hs │ │ │ ├── snippet17.hs │ │ │ ├── snippet18.hs │ │ │ ├── snippet19.hs │ │ │ ├── snippet20.hs │ │ │ ├── snippet21.hs │ │ │ ├── snippet22.hs │ │ │ ├── snippet23.hs │ │ │ ├── snippet24.hs │ │ │ └── snippet25.hs │ │ ├── ocaml │ │ │ ├── snippet01.ml │ │ │ ├── snippet02.ml │ │ │ ├── snippet03.ml │ │ │ ├── snippet04.ml │ │ │ ├── snippet05.ml │ │ │ ├── snippet06.ml │ │ │ ├── snippet07.ml │ │ │ ├── snippet08.ml │ │ │ ├── snippet09.ml │ │ │ ├── snippet10.ml │ │ │ ├── snippet11.ml │ │ │ ├── snippet12.ml │ │ │ ├── snippet13.ml │ │ │ ├── snippet14.ml │ │ │ ├── snippet15.ml │ │ │ ├── snippet16.ml │ │ │ ├── snippet17.ml │ │ │ ├── snippet18.ml │ │ │ ├── snippet19.ml │ │ │ ├── snippet20.ml │ │ │ ├── snippet21.ml │ │ │ ├── snippet22.ml │ │ │ ├── snippet23.ml │ │ │ ├── snippet24.ml │ │ │ └── snippet25.ml │ │ ├── reason │ │ │ ├── snippet01.re │ │ │ ├── snippet02.re │ │ │ ├── snippet03.re │ │ │ ├── snippet04.re │ │ │ ├── snippet05.re │ │ │ ├── snippet06.re │ │ │ ├── snippet07.re │ │ │ ├── snippet08.re │ │ │ ├── snippet09.re │ │ │ ├── snippet10.re │ │ │ ├── snippet11.re │ │ │ ├── snippet12.re │ │ │ ├── snippet13.re │ │ │ ├── snippet14.re │ │ │ ├── snippet15.re │ │ │ ├── snippet16.re │ │ │ ├── snippet17.re │ │ │ ├── snippet18.re │ │ │ ├── snippet19.re │ │ │ ├── snippet20.re │ │ │ ├── snippet21.re │ │ │ ├── snippet22.re │ │ │ ├── snippet23.re │ │ │ ├── snippet24.re │ │ │ └── snippet25.re │ │ └── scala │ │ │ ├── snippet01.scala │ │ │ ├── snippet02.scala │ │ │ ├── snippet03.scala │ │ │ ├── snippet04.scala │ │ │ ├── snippet05.scala │ │ │ ├── snippet06.scala │ │ │ ├── snippet07.scala │ │ │ ├── snippet08.scala │ │ │ ├── snippet09.scala │ │ │ ├── snippet10.scala │ │ │ ├── snippet11.scala │ │ │ ├── snippet12.scala │ │ │ ├── snippet13.scala │ │ │ ├── snippet14.scala │ │ │ ├── snippet15.scala │ │ │ ├── snippet16.scala │ │ │ ├── snippet17.scala │ │ │ ├── snippet18.scala │ │ │ ├── snippet19.scala │ │ │ ├── snippet20.scala │ │ │ ├── snippet21.scala │ │ │ ├── snippet22.scala │ │ │ ├── snippet23.scala │ │ │ ├── snippet24.scala │ │ │ └── snippet25.scala │ └── monads-programmers-definition.tex ├── 3.5 │ ├── code │ │ ├── haskell │ │ │ ├── snippet01.hs │ │ │ ├── snippet02.hs │ │ │ ├── snippet03.hs │ │ │ ├── snippet04.hs │ │ │ ├── snippet05.hs │ │ │ ├── snippet06.hs │ │ │ ├── snippet07.hs │ │ │ ├── snippet08.hs │ │ │ ├── snippet09.hs │ │ │ ├── snippet10.hs │ │ │ ├── snippet11.hs │ │ │ ├── snippet12.hs │ │ │ ├── snippet13.hs │ │ │ ├── snippet14.hs │ │ │ ├── snippet15.hs │ │ │ ├── snippet16.hs │ │ │ ├── snippet17.hs │ │ │ ├── snippet18.hs │ │ │ ├── snippet19.hs │ │ │ ├── snippet20.hs │ │ │ ├── snippet21.hs │ │ │ ├── snippet22.hs │ │ │ ├── snippet23.hs │ │ │ ├── snippet24.hs │ │ │ ├── snippet25.hs │ │ │ ├── snippet26.hs │ │ │ ├── snippet27.hs │ │ │ ├── snippet28.hs │ │ │ ├── snippet29.hs │ │ │ ├── snippet30.hs │ │ │ ├── snippet31.hs │ │ │ ├── snippet32.hs │ │ │ ├── snippet33.hs │ │ │ ├── snippet34.hs │ │ │ ├── snippet35.hs │ │ │ ├── snippet36.hs │ │ │ └── snippet37.hs │ │ ├── ocaml │ │ │ ├── snippet01.ml │ │ │ ├── snippet02.ml │ │ │ ├── snippet03.ml │ │ │ ├── snippet04.ml │ │ │ ├── snippet05.ml │ │ │ ├── snippet06.ml │ │ │ ├── snippet07.ml │ │ │ ├── snippet08.ml │ │ │ ├── snippet09.ml │ │ │ ├── snippet10.ml │ │ │ ├── snippet11.ml │ │ │ ├── snippet12.ml │ │ │ ├── snippet13.ml │ │ │ ├── snippet14.ml │ │ │ ├── snippet15.ml │ │ │ ├── snippet16.ml │ │ │ ├── snippet17.ml │ │ │ ├── snippet18.ml │ │ │ ├── snippet19.ml │ │ │ ├── snippet20.ml │ │ │ ├── snippet21.ml │ │ │ ├── snippet22.ml │ │ │ ├── snippet23.ml │ │ │ ├── snippet24.ml │ │ │ ├── snippet25.ml │ │ │ ├── snippet26.ml │ │ │ ├── snippet27.ml │ │ │ ├── snippet28.ml │ │ │ ├── snippet29.ml │ │ │ ├── snippet30.ml │ │ │ ├── snippet31.ml │ │ │ ├── snippet32.ml │ │ │ ├── snippet33.ml │ │ │ ├── snippet34.ml │ │ │ ├── snippet35.ml │ │ │ ├── snippet36.ml │ │ │ └── snippet37.ml │ │ ├── reason │ │ │ ├── snippet01.re │ │ │ ├── snippet02.re │ │ │ ├── snippet03.re │ │ │ ├── snippet04.re │ │ │ ├── snippet05.re │ │ │ ├── snippet06.re │ │ │ ├── snippet07.re │ │ │ ├── snippet08.re │ │ │ ├── snippet09.re │ │ │ ├── snippet10.re │ │ │ ├── snippet11.re │ │ │ ├── snippet12.re │ │ │ ├── snippet13.re │ │ │ ├── snippet14.re │ │ │ ├── snippet15.re │ │ │ ├── snippet16.re │ │ │ ├── snippet17.re │ │ │ ├── snippet18.re │ │ │ ├── snippet19.re │ │ │ ├── snippet20.re │ │ │ ├── snippet21.re │ │ │ ├── snippet22.re │ │ │ ├── snippet23.re │ │ │ ├── snippet24.re │ │ │ ├── snippet25.re │ │ │ ├── snippet26.re │ │ │ ├── snippet27.re │ │ │ ├── snippet28.re │ │ │ ├── snippet29.re │ │ │ ├── snippet30.re │ │ │ ├── snippet31.re │ │ │ ├── snippet32.re │ │ │ ├── snippet33.re │ │ │ ├── snippet34.re │ │ │ ├── snippet35.re │ │ │ ├── snippet36.re │ │ │ └── snippet37.re │ │ └── scala │ │ │ ├── snippet01.scala │ │ │ ├── snippet02.scala │ │ │ ├── snippet03.scala │ │ │ ├── snippet04.scala │ │ │ ├── snippet05.scala │ │ │ ├── snippet06.scala │ │ │ ├── snippet07.scala │ │ │ ├── snippet08.scala │ │ │ ├── snippet09.scala │ │ │ ├── snippet10.scala │ │ │ ├── snippet11.scala │ │ │ ├── snippet12.scala │ │ │ ├── snippet13.scala │ │ │ ├── snippet14.scala │ │ │ ├── snippet15.scala │ │ │ ├── snippet16.scala │ │ │ ├── snippet17.scala │ │ │ ├── snippet18.scala │ │ │ ├── snippet19.scala │ │ │ ├── snippet20.scala │ │ │ ├── snippet21.scala │ │ │ ├── snippet22.scala │ │ │ ├── snippet23.scala │ │ │ ├── snippet24.scala │ │ │ ├── snippet25.scala │ │ │ ├── snippet26.scala │ │ │ ├── snippet27.scala │ │ │ ├── snippet28.scala │ │ │ ├── snippet29.scala │ │ │ ├── snippet30.scala │ │ │ ├── snippet31.scala │ │ │ ├── snippet32.scala │ │ │ ├── snippet33.scala │ │ │ ├── snippet34.scala │ │ │ ├── snippet35.scala │ │ │ ├── snippet36.scala │ │ │ └── snippet37.scala │ └── monads-and-effects.tex ├── 3.6 │ ├── code │ │ ├── haskell │ │ │ ├── snippet01.hs │ │ │ ├── snippet02.hs │ │ │ ├── snippet03.hs │ │ │ ├── snippet04.hs │ │ │ ├── snippet05.hs │ │ │ ├── snippet06.hs │ │ │ ├── snippet07.hs │ │ │ ├── snippet08.hs │ │ │ ├── snippet09.hs │ │ │ ├── snippet10.hs │ │ │ ├── snippet11.hs │ │ │ ├── snippet12.hs │ │ │ ├── snippet13.hs │ │ │ ├── snippet14.hs │ │ │ ├── snippet15.hs │ │ │ ├── snippet16.hs │ │ │ ├── snippet17.hs │ │ │ ├── snippet18.hs │ │ │ ├── snippet19.hs │ │ │ ├── snippet20.hs │ │ │ ├── snippet21.hs │ │ │ ├── snippet22.hs │ │ │ ├── snippet23.hs │ │ │ ├── snippet24.hs │ │ │ └── snippet25.hs │ │ ├── ocaml │ │ │ ├── snippet01.ml │ │ │ ├── snippet02.ml │ │ │ ├── snippet03.ml │ │ │ ├── snippet04.ml │ │ │ ├── snippet05.ml │ │ │ ├── snippet06.ml │ │ │ ├── snippet07.ml │ │ │ ├── snippet08.ml │ │ │ ├── snippet09.ml │ │ │ ├── snippet10.ml │ │ │ ├── snippet11.ml │ │ │ ├── snippet12.ml │ │ │ ├── snippet13.ml │ │ │ ├── snippet14.ml │ │ │ ├── snippet15.ml │ │ │ ├── snippet16.ml │ │ │ ├── snippet17.ml │ │ │ ├── snippet18.ml │ │ │ ├── snippet19.ml │ │ │ ├── snippet20.ml │ │ │ ├── snippet21.ml │ │ │ ├── snippet22.ml │ │ │ ├── snippet23.ml │ │ │ ├── snippet24.ml │ │ │ └── snippet25.ml │ │ ├── reason │ │ │ ├── snippet01.re │ │ │ ├── snippet02.re │ │ │ ├── snippet03.re │ │ │ ├── snippet04.re │ │ │ ├── snippet05.re │ │ │ ├── snippet06.re │ │ │ ├── snippet07.re │ │ │ ├── snippet08.re │ │ │ ├── snippet09.re │ │ │ ├── snippet10.re │ │ │ ├── snippet11.re │ │ │ ├── snippet12.re │ │ │ ├── snippet13.re │ │ │ ├── snippet14.re │ │ │ ├── snippet15.re │ │ │ ├── snippet16.re │ │ │ ├── snippet17.re │ │ │ ├── snippet18.re │ │ │ ├── snippet19.re │ │ │ ├── snippet20.re │ │ │ ├── snippet21.re │ │ │ ├── snippet22.re │ │ │ ├── snippet23.re │ │ │ ├── snippet24.re │ │ │ └── snippet25.re │ │ └── scala │ │ │ ├── snippet01.scala │ │ │ ├── snippet02.scala │ │ │ ├── snippet03.scala │ │ │ ├── snippet04.scala │ │ │ ├── snippet05.scala │ │ │ ├── snippet06.scala │ │ │ ├── snippet07.scala │ │ │ ├── snippet08.scala │ │ │ ├── snippet09.scala │ │ │ ├── snippet10.scala │ │ │ ├── snippet11.scala │ │ │ ├── snippet12.scala │ │ │ ├── snippet13.scala │ │ │ ├── snippet14.scala │ │ │ ├── snippet15.scala │ │ │ ├── snippet16.scala │ │ │ ├── snippet17.scala │ │ │ ├── snippet18.scala │ │ │ ├── snippet19.scala │ │ │ ├── snippet20.scala │ │ │ ├── snippet21.scala │ │ │ ├── snippet22.scala │ │ │ ├── snippet23.scala │ │ │ ├── snippet24.scala │ │ │ └── snippet25.scala │ ├── images │ │ ├── assoc.png │ │ ├── assoc1.png │ │ ├── assoc2.png │ │ ├── assocmon.png │ │ ├── assoctensor.jpg │ │ ├── exptree.png │ │ ├── horizcomp.png │ │ ├── monoid-1.jpg │ │ ├── unitlawcomp-1.png │ │ ├── unitlawcomp.png │ │ └── unitmon.jpg │ └── monads-categorically.tex ├── 3.7 │ ├── code │ │ ├── haskell │ │ │ ├── snippet01.hs │ │ │ ├── snippet02.hs │ │ │ ├── snippet03.hs │ │ │ ├── snippet04.hs │ │ │ ├── snippet05.hs │ │ │ ├── snippet06.hs │ │ │ ├── snippet07.hs │ │ │ ├── snippet08.hs │ │ │ ├── snippet09.hs │ │ │ ├── snippet10.hs │ │ │ ├── snippet11.hs │ │ │ ├── snippet12.hs │ │ │ ├── snippet13.hs │ │ │ ├── snippet14.hs │ │ │ ├── snippet15.hs │ │ │ ├── snippet16.hs │ │ │ ├── snippet17.hs │ │ │ ├── snippet18.hs │ │ │ ├── snippet19.hs │ │ │ ├── snippet20.hs │ │ │ ├── snippet21.hs │ │ │ ├── snippet22.hs │ │ │ ├── snippet23.hs │ │ │ ├── snippet24.hs │ │ │ ├── snippet25.hs │ │ │ ├── snippet26.hs │ │ │ ├── snippet27.hs │ │ │ ├── snippet28.hs │ │ │ ├── snippet29.hs │ │ │ ├── snippet30.hs │ │ │ ├── snippet31.hs │ │ │ ├── snippet32.hs │ │ │ ├── snippet33.hs │ │ │ ├── snippet34.hs │ │ │ ├── snippet35.hs │ │ │ ├── snippet36.hs │ │ │ ├── snippet37.hs │ │ │ ├── snippet38.hs │ │ │ └── snippet39.hs │ │ ├── ocaml │ │ │ ├── snippet01.ml │ │ │ ├── snippet02.ml │ │ │ ├── snippet03.ml │ │ │ ├── snippet04.ml │ │ │ ├── snippet05.ml │ │ │ ├── snippet06.ml │ │ │ ├── snippet07.ml │ │ │ ├── snippet08.ml │ │ │ ├── snippet09.ml │ │ │ ├── snippet10.ml │ │ │ ├── snippet11.ml │ │ │ ├── snippet12.ml │ │ │ ├── snippet13.ml │ │ │ ├── snippet14.ml │ │ │ ├── snippet15.ml │ │ │ ├── snippet16.ml │ │ │ ├── snippet17.ml │ │ │ ├── snippet18.ml │ │ │ ├── snippet19.ml │ │ │ ├── snippet20.ml │ │ │ ├── snippet21.ml │ │ │ ├── snippet22.ml │ │ │ ├── snippet23.ml │ │ │ ├── snippet24.ml │ │ │ ├── snippet25.ml │ │ │ ├── snippet26.ml │ │ │ ├── snippet27.ml │ │ │ ├── snippet28.ml │ │ │ ├── snippet29.ml │ │ │ ├── snippet30.ml │ │ │ ├── snippet31.ml │ │ │ ├── snippet32.ml │ │ │ ├── snippet33.ml │ │ │ ├── snippet34.ml │ │ │ ├── snippet35.ml │ │ │ ├── snippet36.ml │ │ │ ├── snippet37.ml │ │ │ ├── snippet38.ml │ │ │ └── snippet39.ml │ │ ├── reason │ │ │ ├── snippet01.re │ │ │ ├── snippet02.re │ │ │ ├── snippet03.re │ │ │ ├── snippet04.re │ │ │ ├── snippet05.re │ │ │ ├── snippet06.re │ │ │ ├── snippet07.re │ │ │ ├── snippet08.re │ │ │ ├── snippet09.re │ │ │ ├── snippet10.re │ │ │ ├── snippet11.re │ │ │ ├── snippet12.re │ │ │ ├── snippet13.re │ │ │ ├── snippet14.re │ │ │ ├── snippet15.re │ │ │ ├── snippet16.re │ │ │ ├── snippet17.re │ │ │ ├── snippet18.re │ │ │ ├── snippet19.re │ │ │ ├── snippet20.re │ │ │ ├── snippet21.re │ │ │ ├── snippet22.re │ │ │ ├── snippet23.re │ │ │ ├── snippet24.re │ │ │ ├── snippet25.re │ │ │ ├── snippet26.re │ │ │ ├── snippet27.re │ │ │ ├── snippet28.re │ │ │ ├── snippet29.re │ │ │ ├── snippet30.re │ │ │ ├── snippet31.re │ │ │ ├── snippet32.re │ │ │ ├── snippet33.re │ │ │ ├── snippet34.re │ │ │ ├── snippet35.re │ │ │ ├── snippet36.re │ │ │ ├── snippet37.re │ │ │ ├── snippet38.re │ │ │ └── snippet39.re │ │ └── scala │ │ │ ├── snippet01.scala │ │ │ ├── snippet02.scala │ │ │ ├── snippet03.scala │ │ │ ├── snippet04.scala │ │ │ ├── snippet05.scala │ │ │ ├── snippet06.scala │ │ │ ├── snippet07.scala │ │ │ ├── snippet08.scala │ │ │ ├── snippet09.scala │ │ │ ├── snippet10.scala │ │ │ ├── snippet11.scala │ │ │ ├── snippet12.scala │ │ │ ├── snippet13.scala │ │ │ ├── snippet14.scala │ │ │ ├── snippet15.scala │ │ │ ├── snippet16.scala │ │ │ ├── snippet17.scala │ │ │ ├── snippet18.scala │ │ │ ├── snippet19.scala │ │ │ ├── snippet20.scala │ │ │ ├── snippet21.scala │ │ │ ├── snippet22.scala │ │ │ ├── snippet23.scala │ │ │ ├── snippet24.scala │ │ │ ├── snippet25.scala │ │ │ ├── snippet26.scala │ │ │ ├── snippet27.scala │ │ │ ├── snippet28.scala │ │ │ ├── snippet29.scala │ │ │ ├── snippet30.scala │ │ │ ├── snippet31.scala │ │ │ ├── snippet32.scala │ │ │ ├── snippet33.scala │ │ │ ├── snippet34.scala │ │ │ ├── snippet35.scala │ │ │ ├── snippet36.scala │ │ │ ├── snippet37.scala │ │ │ ├── snippet38.scala │ │ │ └── snippet39.scala │ └── comonads.tex ├── 3.8 │ ├── code │ │ ├── haskell │ │ │ ├── snippet01.hs │ │ │ ├── snippet02.hs │ │ │ ├── snippet03.hs │ │ │ ├── snippet04.hs │ │ │ ├── snippet05.hs │ │ │ ├── snippet06.hs │ │ │ ├── snippet07.hs │ │ │ ├── snippet08.hs │ │ │ ├── snippet09.hs │ │ │ ├── snippet10.hs │ │ │ ├── snippet11.hs │ │ │ ├── snippet12.hs │ │ │ ├── snippet13.hs │ │ │ ├── snippet14.hs │ │ │ ├── snippet15.hs │ │ │ ├── snippet16.hs │ │ │ ├── snippet17.hs │ │ │ ├── snippet18.hs │ │ │ ├── snippet19.hs │ │ │ ├── snippet20.hs │ │ │ ├── snippet21.hs │ │ │ ├── snippet22.hs │ │ │ ├── snippet23.hs │ │ │ ├── snippet24.hs │ │ │ ├── snippet25.hs │ │ │ ├── snippet26.hs │ │ │ ├── snippet27.hs │ │ │ ├── snippet28.hs │ │ │ ├── snippet29.hs │ │ │ ├── snippet30.hs │ │ │ ├── snippet31.hs │ │ │ ├── snippet32.hs │ │ │ ├── snippet33.hs │ │ │ ├── snippet34.hs │ │ │ └── snippet35.hs │ │ ├── ocaml │ │ │ ├── snippet01.ml │ │ │ ├── snippet02.ml │ │ │ ├── snippet03.ml │ │ │ ├── snippet04.ml │ │ │ ├── snippet05.ml │ │ │ ├── snippet06.ml │ │ │ ├── snippet07.ml │ │ │ ├── snippet08.ml │ │ │ ├── snippet09.ml │ │ │ ├── snippet10.ml │ │ │ ├── snippet11.ml │ │ │ ├── snippet12.ml │ │ │ ├── snippet13.ml │ │ │ ├── snippet14.ml │ │ │ ├── snippet15.ml │ │ │ ├── snippet16.ml │ │ │ ├── snippet17.ml │ │ │ ├── snippet18.ml │ │ │ ├── snippet19.ml │ │ │ ├── snippet20.ml │ │ │ ├── snippet21.ml │ │ │ ├── snippet22.ml │ │ │ ├── snippet23.ml │ │ │ ├── snippet24.ml │ │ │ ├── snippet25.ml │ │ │ ├── snippet26.ml │ │ │ ├── snippet27.ml │ │ │ ├── snippet28.ml │ │ │ ├── snippet29.ml │ │ │ ├── snippet30.ml │ │ │ ├── snippet31.ml │ │ │ ├── snippet32.ml │ │ │ ├── snippet33.ml │ │ │ ├── snippet34.ml │ │ │ └── snippet35.ml │ │ ├── reason │ │ │ ├── snippet01.re │ │ │ ├── snippet02.re │ │ │ ├── snippet03.re │ │ │ ├── snippet04.re │ │ │ ├── snippet05.re │ │ │ ├── snippet06.re │ │ │ ├── snippet07.re │ │ │ ├── snippet08.re │ │ │ ├── snippet09.re │ │ │ ├── snippet10.re │ │ │ ├── snippet11.re │ │ │ ├── snippet12.re │ │ │ ├── snippet13.re │ │ │ ├── snippet14.re │ │ │ ├── snippet15.re │ │ │ ├── snippet16.re │ │ │ ├── snippet17.re │ │ │ ├── snippet18.re │ │ │ ├── snippet19.re │ │ │ ├── snippet20.re │ │ │ ├── snippet21.re │ │ │ ├── snippet22.re │ │ │ ├── snippet23.re │ │ │ ├── snippet24.re │ │ │ ├── snippet25.re │ │ │ ├── snippet26.re │ │ │ ├── snippet27.re │ │ │ ├── snippet28.re │ │ │ ├── snippet29.re │ │ │ ├── snippet30.re │ │ │ ├── snippet31.re │ │ │ ├── snippet32.re │ │ │ ├── snippet33.re │ │ │ ├── snippet34.re │ │ │ └── snippet35.re │ │ └── scala │ │ │ ├── snippet01.scala │ │ │ ├── snippet02.scala │ │ │ ├── snippet03.scala │ │ │ ├── snippet04.scala │ │ │ ├── snippet05.scala │ │ │ ├── snippet06.scala │ │ │ ├── snippet07.scala │ │ │ ├── snippet08.scala │ │ │ ├── snippet09.scala │ │ │ ├── snippet10.scala │ │ │ ├── snippet11.scala │ │ │ ├── snippet12.scala │ │ │ ├── snippet13.scala │ │ │ ├── snippet14.scala │ │ │ ├── snippet15.scala │ │ │ ├── snippet16.scala │ │ │ ├── snippet17.scala │ │ │ ├── snippet18.scala │ │ │ ├── snippet19.scala │ │ │ ├── snippet20.scala │ │ │ ├── snippet21.scala │ │ │ ├── snippet22.scala │ │ │ ├── snippet23.scala │ │ │ ├── snippet24.scala │ │ │ ├── snippet25.scala │ │ │ ├── snippet26.scala │ │ │ ├── snippet27.scala │ │ │ ├── snippet28.scala │ │ │ ├── snippet29.scala │ │ │ ├── snippet30.scala │ │ │ ├── snippet31.scala │ │ │ ├── snippet32.scala │ │ │ ├── snippet33.scala │ │ │ ├── snippet34.scala │ │ │ └── snippet35.scala │ ├── f-algebras.tex │ └── images │ │ ├── alg.png │ │ ├── alg2.png │ │ ├── alg3.png │ │ ├── alg3a.png │ │ ├── alg4.png │ │ ├── alg5.png │ │ ├── alg6.png │ │ └── alg7.png ├── 3.9 │ ├── algebras-for-monads.tex │ ├── code │ │ ├── haskell │ │ │ ├── snippet01.hs │ │ │ ├── snippet02.hs │ │ │ ├── snippet03.hs │ │ │ ├── snippet04.hs │ │ │ ├── snippet05.hs │ │ │ ├── snippet06.hs │ │ │ ├── snippet07.hs │ │ │ ├── snippet08.hs │ │ │ ├── snippet09.hs │ │ │ ├── snippet10.hs │ │ │ ├── snippet11.hs │ │ │ ├── snippet12.hs │ │ │ ├── snippet13.hs │ │ │ ├── snippet14.hs │ │ │ └── snippet15.hs │ │ ├── ocaml │ │ │ ├── snippet01.ml │ │ │ ├── snippet02.ml │ │ │ ├── snippet03.ml │ │ │ ├── snippet04.ml │ │ │ ├── snippet05.ml │ │ │ ├── snippet06.ml │ │ │ ├── snippet07.ml │ │ │ ├── snippet08.ml │ │ │ ├── snippet09.ml │ │ │ ├── snippet10.ml │ │ │ ├── snippet11.ml │ │ │ ├── snippet12.ml │ │ │ ├── snippet13.ml │ │ │ ├── snippet14.ml │ │ │ └── snippet15.ml │ │ ├── reason │ │ │ ├── snippet01.re │ │ │ ├── snippet02.re │ │ │ ├── snippet03.re │ │ │ ├── snippet04.re │ │ │ ├── snippet05.re │ │ │ ├── snippet06.re │ │ │ ├── snippet07.re │ │ │ ├── snippet08.re │ │ │ ├── snippet09.re │ │ │ ├── snippet10.re │ │ │ ├── snippet11.re │ │ │ ├── snippet12.re │ │ │ ├── snippet13.re │ │ │ ├── snippet14.re │ │ │ └── snippet15.re │ │ └── scala │ │ │ ├── snippet01.scala │ │ │ ├── snippet02.scala │ │ │ ├── snippet03.scala │ │ │ ├── snippet04.scala │ │ │ ├── snippet05.scala │ │ │ ├── snippet06.scala │ │ │ ├── snippet07.scala │ │ │ ├── snippet08.scala │ │ │ ├── snippet09.scala │ │ │ ├── snippet10.scala │ │ │ ├── snippet11.scala │ │ │ ├── snippet12.scala │ │ │ ├── snippet13.scala │ │ │ ├── snippet14.scala │ │ │ └── snippet15.scala │ └── images │ │ └── pigalg.png ├── editor-note.tex ├── ocaml │ ├── colophon.tex │ └── editor-note.tex ├── reason │ ├── colophon.tex │ └── editor-note.tex └── scala │ ├── colophon.tex │ └── editor-note.tex ├── cover ├── bartosz.jpg ├── blurb.tex ├── bunnies.png ├── cover-hardcover-ocaml.tex ├── cover-hardcover-reason.tex ├── cover-hardcover-scala.tex ├── cover-hardcover.tex ├── cover-paperback-ocaml.tex ├── cover-paperback-reason.tex ├── cover-paperback-scala.tex ├── cover-paperback.tex ├── piggie.png ├── ribbon-ocaml.tex ├── ribbon-reason.tex └── ribbon-scala.tex ├── ctfp-print-ocaml.tex ├── ctfp-print-reason.tex ├── ctfp-print-scala.tex ├── ctfp-print.tex ├── ctfp-reader-ocaml.tex ├── ctfp-reader-reason.tex ├── ctfp-reader-scala.tex ├── ctfp-reader.tex ├── ctfp.tex ├── fig └── icons │ ├── by.pdf │ ├── cc.pdf │ ├── haskell.png │ ├── ocaml.png │ ├── reason.png │ ├── sa.pdf │ └── scala.png ├── free-software.tex ├── half-title.tex ├── index.tex ├── opt-ocaml.tex ├── opt-print-ustrade.tex ├── opt-reader-10in.tex ├── opt-reason.tex ├── opt-scala.tex ├── postamble.tex ├── preamble.tex ├── scraper.py └── version.tex /.envrc: -------------------------------------------------------------------------------- 1 | use flake . 2 | use flake github:loophp/nix-prettier 3 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "proseWrap": "always" 3 | } 4 | -------------------------------------------------------------------------------- /src/content/1.1/code/haskell/snippet01.hs: -------------------------------------------------------------------------------- 1 | f :: A -> B -------------------------------------------------------------------------------- /src/content/1.1/code/haskell/snippet02.hs: -------------------------------------------------------------------------------- 1 | g :: B -> C -------------------------------------------------------------------------------- /src/content/1.1/code/haskell/snippet03.hs: -------------------------------------------------------------------------------- 1 | g . f -------------------------------------------------------------------------------- /src/content/1.1/code/haskell/snippet05.hs: -------------------------------------------------------------------------------- 1 | id :: a -> a 2 | id x = x -------------------------------------------------------------------------------- /src/content/1.1/code/haskell/snippet06.hs: -------------------------------------------------------------------------------- 1 | f . id == f 2 | id . f == f -------------------------------------------------------------------------------- /src/content/1.1/code/ocaml/snippet05.ml: -------------------------------------------------------------------------------- 1 | let id x = x 2 | -------------------------------------------------------------------------------- /src/content/1.1/code/ocaml/snippet06.ml: -------------------------------------------------------------------------------- 1 | f >> id 2 | id >> f 3 | -------------------------------------------------------------------------------- /src/content/1.1/code/reason/snippet05.re: -------------------------------------------------------------------------------- 1 | let id = x => x; 2 | -------------------------------------------------------------------------------- /src/content/1.1/code/reason/snippet06.re: -------------------------------------------------------------------------------- 1 | f >> id; 2 | id >> f; 3 | -------------------------------------------------------------------------------- /src/content/1.1/code/scala/snippet01.scala: -------------------------------------------------------------------------------- 1 | val f: A => B -------------------------------------------------------------------------------- /src/content/1.1/code/scala/snippet02.scala: -------------------------------------------------------------------------------- 1 | val g: B => C -------------------------------------------------------------------------------- /src/content/1.1/code/scala/snippet03.scala: -------------------------------------------------------------------------------- 1 | g compose f -------------------------------------------------------------------------------- /src/content/1.1/code/scala/snippet05.scala: -------------------------------------------------------------------------------- 1 | def identity[A](a: A): A = a -------------------------------------------------------------------------------- /src/content/1.1/code/scala/snippet06.scala: -------------------------------------------------------------------------------- 1 | f compose identity[A] == f 2 | identity[B] _ compose f == f -------------------------------------------------------------------------------- /src/content/1.10/code/haskell/snippet01.hs: -------------------------------------------------------------------------------- 1 | alpha :: forall a . F a -> G a -------------------------------------------------------------------------------- /src/content/1.10/code/haskell/snippet02.hs: -------------------------------------------------------------------------------- 1 | alpha :: F a -> G a -------------------------------------------------------------------------------- /src/content/1.10/code/haskell/snippet03.hs: -------------------------------------------------------------------------------- 1 | alpha :: F a -> G a -------------------------------------------------------------------------------- /src/content/1.10/code/haskell/snippet05.hs: -------------------------------------------------------------------------------- 1 | fmap f . safeHead = safeHead . fmap f -------------------------------------------------------------------------------- /src/content/1.10/code/haskell/snippet06.hs: -------------------------------------------------------------------------------- 1 | fmap f (safeHead []) = fmap f Nothing = Nothing -------------------------------------------------------------------------------- /src/content/1.10/code/haskell/snippet07.hs: -------------------------------------------------------------------------------- 1 | safeHead (fmap f []) = safeHead [] = Nothing -------------------------------------------------------------------------------- /src/content/1.10/code/haskell/snippet08.hs: -------------------------------------------------------------------------------- 1 | fmap f (safeHead (x:xs)) = fmap f (Just x) = Just (f x) -------------------------------------------------------------------------------- /src/content/1.10/code/haskell/snippet10.hs: -------------------------------------------------------------------------------- 1 | fmap f [] = [] 2 | fmap f (x:xs) = f x : fmap f xs -------------------------------------------------------------------------------- /src/content/1.10/code/haskell/snippet11.hs: -------------------------------------------------------------------------------- 1 | fmap f Nothing = Nothing 2 | fmap f (Just x) = Just (f x) -------------------------------------------------------------------------------- /src/content/1.10/code/haskell/snippet13.hs: -------------------------------------------------------------------------------- 1 | unConst :: Const c a -> c 2 | unConst (Const x) = x -------------------------------------------------------------------------------- /src/content/1.10/code/haskell/snippet14.hs: -------------------------------------------------------------------------------- 1 | length :: [a] -> Int -------------------------------------------------------------------------------- /src/content/1.10/code/haskell/snippet15.hs: -------------------------------------------------------------------------------- 1 | scam :: Const Int a -> Maybe a 2 | scam (Const x) = Nothing -------------------------------------------------------------------------------- /src/content/1.10/code/haskell/snippet16.hs: -------------------------------------------------------------------------------- 1 | newtype Reader e a = Reader (e -> a) -------------------------------------------------------------------------------- /src/content/1.10/code/haskell/snippet18.hs: -------------------------------------------------------------------------------- 1 | alpha :: Reader () a -> Maybe a -------------------------------------------------------------------------------- /src/content/1.10/code/haskell/snippet19.hs: -------------------------------------------------------------------------------- 1 | dumb (Reader _) = Nothing -------------------------------------------------------------------------------- /src/content/1.10/code/haskell/snippet20.hs: -------------------------------------------------------------------------------- 1 | obvious (Reader g) = Just (g ()) -------------------------------------------------------------------------------- /src/content/1.10/code/haskell/snippet21.hs: -------------------------------------------------------------------------------- 1 | newtype Op r a = Op (a -> r) -------------------------------------------------------------------------------- /src/content/1.10/code/haskell/snippet23.hs: -------------------------------------------------------------------------------- 1 | predToStr (Op f) = Op (\x -> if f x then "T" else "F") -------------------------------------------------------------------------------- /src/content/1.10/code/haskell/snippet24.hs: -------------------------------------------------------------------------------- 1 | contramap f . predToStr = predToStr . contramap f -------------------------------------------------------------------------------- /src/content/1.10/code/haskell/snippet25.hs: -------------------------------------------------------------------------------- 1 | contramap :: (b -> a) -> (Op Bool a -> Op Bool b) -------------------------------------------------------------------------------- /src/content/1.10/code/haskell/snippet26.hs: -------------------------------------------------------------------------------- 1 | a -> a -------------------------------------------------------------------------------- /src/content/1.10/code/haskell/snippet27.hs: -------------------------------------------------------------------------------- 1 | (a -> a) -> f a -------------------------------------------------------------------------------- /src/content/1.10/code/ocaml/snippet01.ml: -------------------------------------------------------------------------------- 1 | val alpha : 'a . 'a f -> 'a g 2 | -------------------------------------------------------------------------------- /src/content/1.10/code/ocaml/snippet02.ml: -------------------------------------------------------------------------------- 1 | val alpha : 'a f -> 'a g 2 | -------------------------------------------------------------------------------- /src/content/1.10/code/ocaml/snippet03.ml: -------------------------------------------------------------------------------- 1 | val alpha : 'a f -> 'a g 2 | -------------------------------------------------------------------------------- /src/content/1.10/code/ocaml/snippet05.ml: -------------------------------------------------------------------------------- 1 | compose (fmap f) safe_head = compose safe_head (fmap f) 2 | -------------------------------------------------------------------------------- /src/content/1.10/code/ocaml/snippet07.ml: -------------------------------------------------------------------------------- 1 | let safe_head (fmap f []) = safe_head [] = None 2 | -------------------------------------------------------------------------------- /src/content/1.10/code/ocaml/snippet14.ml: -------------------------------------------------------------------------------- 1 | val length : 'a list -> int 2 | -------------------------------------------------------------------------------- /src/content/1.10/code/ocaml/snippet16.ml: -------------------------------------------------------------------------------- 1 | type ('e, 'a) reader = Reader of ('e -> 'a) 2 | -------------------------------------------------------------------------------- /src/content/1.10/code/ocaml/snippet18.ml: -------------------------------------------------------------------------------- 1 | val alpha : (unit, 'a) reader -> 'a option 2 | -------------------------------------------------------------------------------- /src/content/1.10/code/ocaml/snippet21.ml: -------------------------------------------------------------------------------- 1 | type ('r, 'a) op = Op of ('a -> 'r) 2 | -------------------------------------------------------------------------------- /src/content/1.10/code/ocaml/snippet26.ml: -------------------------------------------------------------------------------- 1 | 'a -> 'a 2 | -------------------------------------------------------------------------------- /src/content/1.10/code/ocaml/snippet27.ml: -------------------------------------------------------------------------------- 1 | ('a -> 'a) -> 'a f 2 | -------------------------------------------------------------------------------- /src/content/1.10/code/reason/snippet01.re: -------------------------------------------------------------------------------- 1 | let alpha: 'a . f('a) => g('a); -------------------------------------------------------------------------------- /src/content/1.10/code/reason/snippet02.re: -------------------------------------------------------------------------------- 1 | let alpha: f('a) => g('a); 2 | -------------------------------------------------------------------------------- /src/content/1.10/code/reason/snippet03.re: -------------------------------------------------------------------------------- 1 | let alpha: f('a) => g('a); 2 | -------------------------------------------------------------------------------- /src/content/1.10/code/reason/snippet07.re: -------------------------------------------------------------------------------- 1 | let safe_head = (fmap, f, []) == safe_head([]) == None; -------------------------------------------------------------------------------- /src/content/1.10/code/reason/snippet14.re: -------------------------------------------------------------------------------- 1 | let length: list('a) => int; 2 | -------------------------------------------------------------------------------- /src/content/1.10/code/reason/snippet16.re: -------------------------------------------------------------------------------- 1 | type reader('e, 'a) = 2 | | Reader('e => 'a); 3 | -------------------------------------------------------------------------------- /src/content/1.10/code/reason/snippet18.re: -------------------------------------------------------------------------------- 1 | let alpha: reader(unit, 'a) => option('a); 2 | -------------------------------------------------------------------------------- /src/content/1.10/code/reason/snippet21.re: -------------------------------------------------------------------------------- 1 | type op('r, 'a) = 2 | | Op('a => 'r); 3 | -------------------------------------------------------------------------------- /src/content/1.10/code/reason/snippet26.re: -------------------------------------------------------------------------------- 1 | 'a => 'a -------------------------------------------------------------------------------- /src/content/1.10/code/reason/snippet27.re: -------------------------------------------------------------------------------- 1 | ('a => 'a) => f('a) 2 | -------------------------------------------------------------------------------- /src/content/1.10/code/scala/snippet01.scala: -------------------------------------------------------------------------------- 1 | def alpha[A]: F[A] => G[A] -------------------------------------------------------------------------------- /src/content/1.10/code/scala/snippet02.scala: -------------------------------------------------------------------------------- 1 | val alpha: F[A] => G[A] -------------------------------------------------------------------------------- /src/content/1.10/code/scala/snippet03.scala: -------------------------------------------------------------------------------- 1 | val alpha: F[A] => G[A] -------------------------------------------------------------------------------- /src/content/1.10/code/scala/snippet05.scala: -------------------------------------------------------------------------------- 1 | (fmap(f) compose safeHead) == (safeHead compose fmap(f)) -------------------------------------------------------------------------------- /src/content/1.10/code/scala/snippet06.scala: -------------------------------------------------------------------------------- 1 | fmap(f)(safeHead(List.empty)) == fmap(f)(None) == None -------------------------------------------------------------------------------- /src/content/1.10/code/scala/snippet08.scala: -------------------------------------------------------------------------------- 1 | fmap(f)(safeHead(x :: xs)) == fmap(f)(Some(x)) == Some(f(x)) -------------------------------------------------------------------------------- /src/content/1.10/code/scala/snippet14.scala: -------------------------------------------------------------------------------- 1 | def length[A]: List[A] => Int -------------------------------------------------------------------------------- /src/content/1.10/code/scala/snippet16.scala: -------------------------------------------------------------------------------- 1 | case class Reader[E, A](run: E => A) -------------------------------------------------------------------------------- /src/content/1.10/code/scala/snippet18.scala: -------------------------------------------------------------------------------- 1 | def alpha[A]: Reader[Unit, A] => Option[A] -------------------------------------------------------------------------------- /src/content/1.10/code/scala/snippet21.scala: -------------------------------------------------------------------------------- 1 | case class Op[R, A](f: A => R) -------------------------------------------------------------------------------- /src/content/1.10/code/scala/snippet26.scala: -------------------------------------------------------------------------------- 1 | A => A -------------------------------------------------------------------------------- /src/content/1.10/code/scala/snippet27.scala: -------------------------------------------------------------------------------- 1 | (A => A) => F[A] -------------------------------------------------------------------------------- /src/content/1.2/code/haskell/snippet01.hs: -------------------------------------------------------------------------------- 1 | x :: Integer -------------------------------------------------------------------------------- /src/content/1.2/code/haskell/snippet02.hs: -------------------------------------------------------------------------------- 1 | f :: Bool -> Bool -------------------------------------------------------------------------------- /src/content/1.2/code/haskell/snippet03.hs: -------------------------------------------------------------------------------- 1 | f :: Bool -> Bool 2 | f x = undefined -------------------------------------------------------------------------------- /src/content/1.2/code/haskell/snippet04.hs: -------------------------------------------------------------------------------- 1 | f :: Bool -> Bool 2 | f = undefined -------------------------------------------------------------------------------- /src/content/1.2/code/haskell/snippet05.hs: -------------------------------------------------------------------------------- 1 | fact n = product [1..n] -------------------------------------------------------------------------------- /src/content/1.2/code/haskell/snippet06.hs: -------------------------------------------------------------------------------- 1 | absurd :: Void -> a -------------------------------------------------------------------------------- /src/content/1.2/code/haskell/snippet07.hs: -------------------------------------------------------------------------------- 1 | f44 :: () -> Integer 2 | f44 () = 44 -------------------------------------------------------------------------------- /src/content/1.2/code/haskell/snippet08.hs: -------------------------------------------------------------------------------- 1 | fInt :: Integer -> () 2 | fInt x = () -------------------------------------------------------------------------------- /src/content/1.2/code/haskell/snippet09.hs: -------------------------------------------------------------------------------- 1 | fInt :: Integer -> () 2 | fInt _ = () -------------------------------------------------------------------------------- /src/content/1.2/code/haskell/snippet10.hs: -------------------------------------------------------------------------------- 1 | unit :: a -> () 2 | unit _ = () -------------------------------------------------------------------------------- /src/content/1.2/code/haskell/snippet11.hs: -------------------------------------------------------------------------------- 1 | data Bool = True | False -------------------------------------------------------------------------------- /src/content/1.2/code/ocaml/snippet010.ml: -------------------------------------------------------------------------------- 1 | let unit _ = () 2 | -------------------------------------------------------------------------------- /src/content/1.2/code/ocaml/snippet011.ml: -------------------------------------------------------------------------------- 1 | type bool = 2 | | false 3 | | true 4 | -------------------------------------------------------------------------------- /src/content/1.2/code/ocaml/snippet05.ml: -------------------------------------------------------------------------------- 1 | let fact n = List.fold (List.range 1 n) ~init:1 ~f:( * ) 2 | -------------------------------------------------------------------------------- /src/content/1.2/code/ocaml/snippet06.ml: -------------------------------------------------------------------------------- 1 | type void 2 | 3 | let rec absurd (x : void) = absurd x 4 | -------------------------------------------------------------------------------- /src/content/1.2/code/ocaml/snippet07.ml: -------------------------------------------------------------------------------- 1 | let f44 () : int = 44 2 | -------------------------------------------------------------------------------- /src/content/1.2/code/ocaml/snippet08.ml: -------------------------------------------------------------------------------- 1 | let f_int (x : int) = () 2 | -------------------------------------------------------------------------------- /src/content/1.2/code/ocaml/snippet09.ml: -------------------------------------------------------------------------------- 1 | let f_int (_ : int) = () 2 | -------------------------------------------------------------------------------- /src/content/1.2/code/ocaml/snippet10.ml: -------------------------------------------------------------------------------- 1 | let unit _ = () 2 | -------------------------------------------------------------------------------- /src/content/1.2/code/ocaml/snippet11.ml: -------------------------------------------------------------------------------- 1 | type bool = 2 | | false 3 | | true 4 | -------------------------------------------------------------------------------- /src/content/1.2/code/reason/snippet01.re: -------------------------------------------------------------------------------- 1 | module type Chapter2_DeclareVariable = {let x: int;}; 2 | -------------------------------------------------------------------------------- /src/content/1.2/code/reason/snippet010.re: -------------------------------------------------------------------------------- 1 | let unit = _ => (); 2 | -------------------------------------------------------------------------------- /src/content/1.2/code/reason/snippet011.re: -------------------------------------------------------------------------------- 1 | type bool = 2 | | false 3 | | true; 4 | -------------------------------------------------------------------------------- /src/content/1.2/code/reason/snippet07.re: -------------------------------------------------------------------------------- 1 | let f44 = (): int => 44; 2 | -------------------------------------------------------------------------------- /src/content/1.2/code/reason/snippet08.re: -------------------------------------------------------------------------------- 1 | let f_int = (x: int) => (); 2 | -------------------------------------------------------------------------------- /src/content/1.2/code/reason/snippet09.re: -------------------------------------------------------------------------------- 1 | let f_int = (_: int) => (); 2 | -------------------------------------------------------------------------------- /src/content/1.2/code/reason/snippet10.re: -------------------------------------------------------------------------------- 1 | let unit = _ => (); 2 | -------------------------------------------------------------------------------- /src/content/1.2/code/reason/snippet11.re: -------------------------------------------------------------------------------- 1 | type bool = 2 | | false 3 | | true; 4 | -------------------------------------------------------------------------------- /src/content/1.2/code/scala/snippet01.scala: -------------------------------------------------------------------------------- 1 | val x: BigInt -------------------------------------------------------------------------------- /src/content/1.2/code/scala/snippet02.scala: -------------------------------------------------------------------------------- 1 | val f: Boolean => Boolean -------------------------------------------------------------------------------- /src/content/1.2/code/scala/snippet03.scala: -------------------------------------------------------------------------------- 1 | val f: Boolean => Boolean = x => ??? -------------------------------------------------------------------------------- /src/content/1.2/code/scala/snippet04.scala: -------------------------------------------------------------------------------- 1 | def f: Boolean => Boolean = ??? -------------------------------------------------------------------------------- /src/content/1.2/code/scala/snippet05.scala: -------------------------------------------------------------------------------- 1 | val fact = (n: Int) => (1 to n).product -------------------------------------------------------------------------------- /src/content/1.2/code/scala/snippet06.scala: -------------------------------------------------------------------------------- 1 | def absurd[A]: Nothing => A -------------------------------------------------------------------------------- /src/content/1.2/code/scala/snippet07.scala: -------------------------------------------------------------------------------- 1 | val f44: Unit => BigInt = _ => 44 -------------------------------------------------------------------------------- /src/content/1.2/code/scala/snippet08.scala: -------------------------------------------------------------------------------- 1 | val fInt: BigInt => Unit = x => () -------------------------------------------------------------------------------- /src/content/1.2/code/scala/snippet09.scala: -------------------------------------------------------------------------------- 1 | val fInt: BigInt => Unit = _ => () -------------------------------------------------------------------------------- /src/content/1.2/code/scala/snippet10.scala: -------------------------------------------------------------------------------- 1 | def unit[A]: A => Unit = _ => () -------------------------------------------------------------------------------- /src/content/1.4/code/haskell/snippet01.hs: -------------------------------------------------------------------------------- 1 | type Writer a = (a, String) -------------------------------------------------------------------------------- /src/content/1.4/code/haskell/snippet02.hs: -------------------------------------------------------------------------------- 1 | a -> Writer b -------------------------------------------------------------------------------- /src/content/1.4/code/haskell/snippet03.hs: -------------------------------------------------------------------------------- 1 | (>=>) :: (a -> Writer b) -> (b -> Writer c) -> (a -> Writer c) -------------------------------------------------------------------------------- /src/content/1.4/code/haskell/snippet05.hs: -------------------------------------------------------------------------------- 1 | return :: a -> Writer a 2 | return x = (x, "") -------------------------------------------------------------------------------- /src/content/1.4/code/ocaml/snippet01.ml: -------------------------------------------------------------------------------- 1 | type 'a writer = 'a * string 2 | -------------------------------------------------------------------------------- /src/content/1.4/code/ocaml/snippet02.ml: -------------------------------------------------------------------------------- 1 | 'a -> 'b writer 2 | -------------------------------------------------------------------------------- /src/content/1.4/code/ocaml/snippet04.ml: -------------------------------------------------------------------------------- 1 | let pure x = x, "" 2 | -------------------------------------------------------------------------------- /src/content/1.4/code/reason/snippet01.re: -------------------------------------------------------------------------------- 1 | type writer('a) = ('a, string); 2 | -------------------------------------------------------------------------------- /src/content/1.4/code/reason/snippet02.re: -------------------------------------------------------------------------------- 1 | 'a => writer('b) -------------------------------------------------------------------------------- /src/content/1.4/code/reason/snippet04.re: -------------------------------------------------------------------------------- 1 | let pure = x => (x, ""); 2 | -------------------------------------------------------------------------------- /src/content/1.4/code/scala/snippet01.scala: -------------------------------------------------------------------------------- 1 | type Writer[A] = (A, String) -------------------------------------------------------------------------------- /src/content/1.4/code/scala/snippet02.scala: -------------------------------------------------------------------------------- 1 | A => Writer[B] -------------------------------------------------------------------------------- /src/content/1.4/code/scala/snippet05.scala: -------------------------------------------------------------------------------- 1 | def pure[A](x: A): Writer[A] = (x, "") -------------------------------------------------------------------------------- /src/content/1.5/code/haskell/snippet01.hs: -------------------------------------------------------------------------------- 1 | absurd :: Void -> a -------------------------------------------------------------------------------- /src/content/1.5/code/haskell/snippet02.hs: -------------------------------------------------------------------------------- 1 | unit :: a -> () 2 | unit _ = () -------------------------------------------------------------------------------- /src/content/1.5/code/haskell/snippet03.hs: -------------------------------------------------------------------------------- 1 | yes :: a -> Bool 2 | yes _ = True -------------------------------------------------------------------------------- /src/content/1.5/code/haskell/snippet04.hs: -------------------------------------------------------------------------------- 1 | no :: a -> Bool 2 | no _ = False -------------------------------------------------------------------------------- /src/content/1.5/code/haskell/snippet05.hs: -------------------------------------------------------------------------------- 1 | f . g = id 2 | g . f = id -------------------------------------------------------------------------------- /src/content/1.5/code/haskell/snippet06.hs: -------------------------------------------------------------------------------- 1 | fst :: (a, b) -> a 2 | fst (x, y) = x -------------------------------------------------------------------------------- /src/content/1.5/code/haskell/snippet07.hs: -------------------------------------------------------------------------------- 1 | snd :: (a, b) -> b 2 | snd (x, y) = y -------------------------------------------------------------------------------- /src/content/1.5/code/haskell/snippet08.hs: -------------------------------------------------------------------------------- 1 | fst (x, _) = x 2 | snd (_, y) = y -------------------------------------------------------------------------------- /src/content/1.5/code/haskell/snippet09.hs: -------------------------------------------------------------------------------- 1 | p :: c -> a 2 | q :: c -> b -------------------------------------------------------------------------------- /src/content/1.5/code/haskell/snippet12.hs: -------------------------------------------------------------------------------- 1 | p' = p . m 2 | q' = q . m -------------------------------------------------------------------------------- /src/content/1.5/code/haskell/snippet13.hs: -------------------------------------------------------------------------------- 1 | m :: Int -> (Int, Bool) 2 | m x = (x, True) -------------------------------------------------------------------------------- /src/content/1.5/code/haskell/snippet14.hs: -------------------------------------------------------------------------------- 1 | p x = fst (m x) = x 2 | q x = snd (m x) = True -------------------------------------------------------------------------------- /src/content/1.5/code/haskell/snippet15.hs: -------------------------------------------------------------------------------- 1 | m (x, _, b) = (x, b) -------------------------------------------------------------------------------- /src/content/1.5/code/haskell/snippet16.hs: -------------------------------------------------------------------------------- 1 | fst = p . m' 2 | snd = q . m' -------------------------------------------------------------------------------- /src/content/1.5/code/haskell/snippet17.hs: -------------------------------------------------------------------------------- 1 | m' (x, b) = (x, x, b) -------------------------------------------------------------------------------- /src/content/1.5/code/haskell/snippet18.hs: -------------------------------------------------------------------------------- 1 | m' (x, b) = (x, 42, b) -------------------------------------------------------------------------------- /src/content/1.5/code/haskell/snippet19.hs: -------------------------------------------------------------------------------- 1 | m :: c -> (a, b) 2 | m x = (p x, q x) -------------------------------------------------------------------------------- /src/content/1.5/code/haskell/snippet21.hs: -------------------------------------------------------------------------------- 1 | i :: a -> c 2 | j :: b -> c -------------------------------------------------------------------------------- /src/content/1.5/code/haskell/snippet22.hs: -------------------------------------------------------------------------------- 1 | i' = m . i 2 | j' = m . j -------------------------------------------------------------------------------- /src/content/1.5/code/haskell/snippet23.hs: -------------------------------------------------------------------------------- 1 | data Contact = PhoneNum Int | EmailAddr String -------------------------------------------------------------------------------- /src/content/1.5/code/haskell/snippet24.hs: -------------------------------------------------------------------------------- 1 | helpdesk :: Contact 2 | helpdesk = PhoneNum 2222222 -------------------------------------------------------------------------------- /src/content/1.5/code/haskell/snippet25.hs: -------------------------------------------------------------------------------- 1 | data Either a b = Left a | Right b -------------------------------------------------------------------------------- /src/content/1.5/code/haskell/snippet27.hs: -------------------------------------------------------------------------------- 1 | p = fst . m 2 | q = snd . m -------------------------------------------------------------------------------- /src/content/1.5/code/haskell/snippet28.hs: -------------------------------------------------------------------------------- 1 | p () = fst (m ()) 2 | q () = snd (m ()) -------------------------------------------------------------------------------- /src/content/1.5/code/ocaml/snippet02.ml: -------------------------------------------------------------------------------- 1 | let unit x = () 2 | -------------------------------------------------------------------------------- /src/content/1.5/code/ocaml/snippet03.ml: -------------------------------------------------------------------------------- 1 | let yes _ = true 2 | -------------------------------------------------------------------------------- /src/content/1.5/code/ocaml/snippet04.ml: -------------------------------------------------------------------------------- 1 | let no _ = false 2 | -------------------------------------------------------------------------------- /src/content/1.5/code/ocaml/snippet05.ml: -------------------------------------------------------------------------------- 1 | compose f g = id 2 | compose g f = id 3 | -------------------------------------------------------------------------------- /src/content/1.5/code/ocaml/snippet06.ml: -------------------------------------------------------------------------------- 1 | let fst (a, b) = a 2 | -------------------------------------------------------------------------------- /src/content/1.5/code/ocaml/snippet07.ml: -------------------------------------------------------------------------------- 1 | let snd (a, b) = b 2 | -------------------------------------------------------------------------------- /src/content/1.5/code/ocaml/snippet08.ml: -------------------------------------------------------------------------------- 1 | let fst (a, _) = a 2 | let snd (_, b) = b 3 | -------------------------------------------------------------------------------- /src/content/1.5/code/ocaml/snippet13.ml: -------------------------------------------------------------------------------- 1 | let m (x : int) = x, true 2 | -------------------------------------------------------------------------------- /src/content/1.5/code/ocaml/snippet14.ml: -------------------------------------------------------------------------------- 1 | let p x = fst (m x) 2 | let q x = snd (m x) 3 | -------------------------------------------------------------------------------- /src/content/1.5/code/ocaml/snippet15.ml: -------------------------------------------------------------------------------- 1 | let m ((x, _, b) : int * int * bool) = x, b 2 | -------------------------------------------------------------------------------- /src/content/1.5/code/ocaml/snippet16.ml: -------------------------------------------------------------------------------- 1 | fst = compose p m' 2 | snd = compose q m' 3 | -------------------------------------------------------------------------------- /src/content/1.5/code/ocaml/snippet17.ml: -------------------------------------------------------------------------------- 1 | let m' ((x, b) : int * bool) = x, x, b 2 | -------------------------------------------------------------------------------- /src/content/1.5/code/ocaml/snippet18.ml: -------------------------------------------------------------------------------- 1 | let m' ((x, b) : int * bool) = x, 42, b 2 | -------------------------------------------------------------------------------- /src/content/1.5/code/ocaml/snippet22.ml: -------------------------------------------------------------------------------- 1 | i' == compose m i 2 | j' == compose m j 3 | -------------------------------------------------------------------------------- /src/content/1.5/code/ocaml/snippet24.ml: -------------------------------------------------------------------------------- 1 | let helpdesk = PhoneNum 2222222 2 | -------------------------------------------------------------------------------- /src/content/1.5/code/ocaml/snippet27.ml: -------------------------------------------------------------------------------- 1 | p = compose fst m 2 | q = compose snd m 3 | -------------------------------------------------------------------------------- /src/content/1.5/code/ocaml/snippet28.ml: -------------------------------------------------------------------------------- 1 | p () = fst (m ()) 2 | q () = snd (m ()) 3 | -------------------------------------------------------------------------------- /src/content/1.5/code/reason/snippet02.re: -------------------------------------------------------------------------------- 1 | let unit = x => (); 2 | -------------------------------------------------------------------------------- /src/content/1.5/code/reason/snippet03.re: -------------------------------------------------------------------------------- 1 | let yes = _ => true; 2 | -------------------------------------------------------------------------------- /src/content/1.5/code/reason/snippet04.re: -------------------------------------------------------------------------------- 1 | let no = _ => false; 2 | -------------------------------------------------------------------------------- /src/content/1.5/code/reason/snippet05.re: -------------------------------------------------------------------------------- 1 | compose(f, g) == id; 2 | compose(g, f) == id; 3 | -------------------------------------------------------------------------------- /src/content/1.5/code/reason/snippet06.re: -------------------------------------------------------------------------------- 1 | let fst = ((a, b)) => a; 2 | -------------------------------------------------------------------------------- /src/content/1.5/code/reason/snippet07.re: -------------------------------------------------------------------------------- 1 | let snd = ((a, b)) => b; 2 | -------------------------------------------------------------------------------- /src/content/1.5/code/reason/snippet08.re: -------------------------------------------------------------------------------- 1 | let fst = ((a, _)) => a; 2 | let snd = ((_, b)) => b; 3 | -------------------------------------------------------------------------------- /src/content/1.5/code/reason/snippet13.re: -------------------------------------------------------------------------------- 1 | let m = (x: int) => (x, true); 2 | -------------------------------------------------------------------------------- /src/content/1.5/code/reason/snippet14.re: -------------------------------------------------------------------------------- 1 | let p = x => fst(m(x)); 2 | let q = x => snd(m(x)); 3 | -------------------------------------------------------------------------------- /src/content/1.5/code/reason/snippet15.re: -------------------------------------------------------------------------------- 1 | let m = ((x, _, b): (int, int, bool)) => (x, b); 2 | -------------------------------------------------------------------------------- /src/content/1.5/code/reason/snippet16.re: -------------------------------------------------------------------------------- 1 | fst == compose(p, m'); 2 | snd == compose(q, m'); 3 | -------------------------------------------------------------------------------- /src/content/1.5/code/reason/snippet17.re: -------------------------------------------------------------------------------- 1 | let m' = ((x, b): (int, bool)) => (x, x, b); 2 | -------------------------------------------------------------------------------- /src/content/1.5/code/reason/snippet18.re: -------------------------------------------------------------------------------- 1 | let m' = ((x, b): (int, bool)) => (x, 42, b); 2 | -------------------------------------------------------------------------------- /src/content/1.5/code/reason/snippet22.re: -------------------------------------------------------------------------------- 1 | i' === compose(m, i) 2 | j' === compose(m, j); 3 | -------------------------------------------------------------------------------- /src/content/1.5/code/reason/snippet24.re: -------------------------------------------------------------------------------- 1 | let helpdesk = PhoneNum(2222222); 2 | -------------------------------------------------------------------------------- /src/content/1.5/code/reason/snippet25.re: -------------------------------------------------------------------------------- 1 | type either('a, 'b) = 2 | | Left('a) 3 | | Right('b); 4 | -------------------------------------------------------------------------------- /src/content/1.5/code/reason/snippet27.re: -------------------------------------------------------------------------------- 1 | p == compose(fst, m); 2 | q == compose(snd, m); 3 | -------------------------------------------------------------------------------- /src/content/1.5/code/reason/snippet28.re: -------------------------------------------------------------------------------- 1 | p() == fst(m()); 2 | q() == snd(m()); 3 | -------------------------------------------------------------------------------- /src/content/1.5/code/scala/snippet01.scala: -------------------------------------------------------------------------------- 1 | def absurd[A]: Nothing => A -------------------------------------------------------------------------------- /src/content/1.5/code/scala/snippet02.scala: -------------------------------------------------------------------------------- 1 | def unit[A]: A => Unit = _ => () -------------------------------------------------------------------------------- /src/content/1.5/code/scala/snippet03.scala: -------------------------------------------------------------------------------- 1 | def yes[A]: A => Boolean = _ => true -------------------------------------------------------------------------------- /src/content/1.5/code/scala/snippet04.scala: -------------------------------------------------------------------------------- 1 | def no[A]: A => Boolean = _ => false -------------------------------------------------------------------------------- /src/content/1.5/code/scala/snippet05.scala: -------------------------------------------------------------------------------- 1 | f compose g == identity _ 2 | g compose f == identity _ -------------------------------------------------------------------------------- /src/content/1.5/code/scala/snippet06.scala: -------------------------------------------------------------------------------- 1 | def fst[A, B]: ((A, B)) => A = { 2 | case (x, y) => x 3 | } -------------------------------------------------------------------------------- /src/content/1.5/code/scala/snippet07.scala: -------------------------------------------------------------------------------- 1 | def snd[A, B]: ((A, B)) => B = { 2 | case (x, y) => y 3 | } -------------------------------------------------------------------------------- /src/content/1.5/code/scala/snippet09.scala: -------------------------------------------------------------------------------- 1 | def p: C => A 2 | def q: C => B -------------------------------------------------------------------------------- /src/content/1.5/code/scala/snippet12.scala: -------------------------------------------------------------------------------- 1 | p1 == p compose m 2 | q1 == q compose m -------------------------------------------------------------------------------- /src/content/1.5/code/scala/snippet13.scala: -------------------------------------------------------------------------------- 1 | def m: Int => (Int, Boolean) = x => (x, true) -------------------------------------------------------------------------------- /src/content/1.5/code/scala/snippet16.scala: -------------------------------------------------------------------------------- 1 | fst == p compose m1 2 | snd == q compose m1 -------------------------------------------------------------------------------- /src/content/1.5/code/scala/snippet19.scala: -------------------------------------------------------------------------------- 1 | def m: C => (A, B) = x => (p(x), q(x)) -------------------------------------------------------------------------------- /src/content/1.5/code/scala/snippet21.scala: -------------------------------------------------------------------------------- 1 | def i: A => C 2 | def j: B => C -------------------------------------------------------------------------------- /src/content/1.5/code/scala/snippet22.scala: -------------------------------------------------------------------------------- 1 | i1 == m compose i 2 | j1 == m compose j -------------------------------------------------------------------------------- /src/content/1.5/code/scala/snippet24.scala: -------------------------------------------------------------------------------- 1 | def helpdesk: Contact = PhoneNum(2222222) -------------------------------------------------------------------------------- /src/content/1.5/code/scala/snippet27.scala: -------------------------------------------------------------------------------- 1 | p == fst compose m 2 | q == snd compose m -------------------------------------------------------------------------------- /src/content/1.5/code/scala/snippet28.scala: -------------------------------------------------------------------------------- 1 | p(()) == fst(m(())) 2 | q(()) == snd(m(())) -------------------------------------------------------------------------------- /src/content/1.6/code/haskell/snippet01.hs: -------------------------------------------------------------------------------- 1 | swap :: (a, b) -> (b, a) 2 | swap (x, y) = (y, x) -------------------------------------------------------------------------------- /src/content/1.6/code/haskell/snippet02.hs: -------------------------------------------------------------------------------- 1 | ((a, b), c) -------------------------------------------------------------------------------- /src/content/1.6/code/haskell/snippet03.hs: -------------------------------------------------------------------------------- 1 | (a, (b, c)) -------------------------------------------------------------------------------- /src/content/1.6/code/haskell/snippet06.hs: -------------------------------------------------------------------------------- 1 | (a, ()) -------------------------------------------------------------------------------- /src/content/1.6/code/haskell/snippet07.hs: -------------------------------------------------------------------------------- 1 | rho :: (a, ()) -> a 2 | rho (x, ()) = x -------------------------------------------------------------------------------- /src/content/1.6/code/haskell/snippet08.hs: -------------------------------------------------------------------------------- 1 | rho_inv :: a -> (a, ()) 2 | rho_inv x = (x, ()) -------------------------------------------------------------------------------- /src/content/1.6/code/haskell/snippet09.hs: -------------------------------------------------------------------------------- 1 | data Pair a b = P a b -------------------------------------------------------------------------------- /src/content/1.6/code/haskell/snippet11.hs: -------------------------------------------------------------------------------- 1 | data Pair a b = Pair a b -------------------------------------------------------------------------------- /src/content/1.6/code/haskell/snippet12.hs: -------------------------------------------------------------------------------- 1 | stmt = (,) "This statement is" False -------------------------------------------------------------------------------- /src/content/1.6/code/haskell/snippet13.hs: -------------------------------------------------------------------------------- 1 | data Stmt = Stmt String Bool -------------------------------------------------------------------------------- /src/content/1.6/code/haskell/snippet18.hs: -------------------------------------------------------------------------------- 1 | atomicNumber :: Element -> Int -------------------------------------------------------------------------------- /src/content/1.6/code/haskell/snippet20.hs: -------------------------------------------------------------------------------- 1 | startsWithSymbol e = symbol e `isPrefixOf` name e -------------------------------------------------------------------------------- /src/content/1.6/code/haskell/snippet21.hs: -------------------------------------------------------------------------------- 1 | data Either a b = Left a | Right b -------------------------------------------------------------------------------- /src/content/1.6/code/haskell/snippet22.hs: -------------------------------------------------------------------------------- 1 | data OneOfThree a b c = Sinistral a | Medial b | Dextral c -------------------------------------------------------------------------------- /src/content/1.6/code/haskell/snippet23.hs: -------------------------------------------------------------------------------- 1 | Either a Void -------------------------------------------------------------------------------- /src/content/1.6/code/haskell/snippet24.hs: -------------------------------------------------------------------------------- 1 | data Color = Red | Green | Blue -------------------------------------------------------------------------------- /src/content/1.6/code/haskell/snippet25.hs: -------------------------------------------------------------------------------- 1 | data Bool = True | False -------------------------------------------------------------------------------- /src/content/1.6/code/haskell/snippet26.hs: -------------------------------------------------------------------------------- 1 | data Maybe a = Nothing | Just a -------------------------------------------------------------------------------- /src/content/1.6/code/haskell/snippet27.hs: -------------------------------------------------------------------------------- 1 | data NothingType = Nothing -------------------------------------------------------------------------------- /src/content/1.6/code/haskell/snippet28.hs: -------------------------------------------------------------------------------- 1 | data JustType a = Just a -------------------------------------------------------------------------------- /src/content/1.6/code/haskell/snippet29.hs: -------------------------------------------------------------------------------- 1 | type Maybe a = Either () a 2 | -------------------------------------------------------------------------------- /src/content/1.6/code/haskell/snippet30.hs: -------------------------------------------------------------------------------- 1 | data List a = Nil | Cons a (List a) -------------------------------------------------------------------------------- /src/content/1.6/code/haskell/snippet32.hs: -------------------------------------------------------------------------------- 1 | (a, Either b c) -------------------------------------------------------------------------------- /src/content/1.6/code/haskell/snippet33.hs: -------------------------------------------------------------------------------- 1 | Either (a, b) (a, c) -------------------------------------------------------------------------------- /src/content/1.6/code/haskell/snippet37.hs: -------------------------------------------------------------------------------- 1 | data List a = Nil | Cons a (List a) -------------------------------------------------------------------------------- /src/content/1.6/code/ocaml/snippet01.ml: -------------------------------------------------------------------------------- 1 | let swap (a, b) = b, a 2 | -------------------------------------------------------------------------------- /src/content/1.6/code/ocaml/snippet02.ml: -------------------------------------------------------------------------------- 1 | (('a * 'b) * 'c) 2 | -------------------------------------------------------------------------------- /src/content/1.6/code/ocaml/snippet03.ml: -------------------------------------------------------------------------------- 1 | ('a * ('b * 'c)) 2 | -------------------------------------------------------------------------------- /src/content/1.6/code/ocaml/snippet04.ml: -------------------------------------------------------------------------------- 1 | let alpha ((a, b), c) = a, (b, c) 2 | -------------------------------------------------------------------------------- /src/content/1.6/code/ocaml/snippet05.ml: -------------------------------------------------------------------------------- 1 | let alpha_inv (a, (b, c)) = (a, b), c 2 | -------------------------------------------------------------------------------- /src/content/1.6/code/ocaml/snippet06.ml: -------------------------------------------------------------------------------- 1 | 'a * unit 2 | -------------------------------------------------------------------------------- /src/content/1.6/code/ocaml/snippet07.ml: -------------------------------------------------------------------------------- 1 | let rho (a, ()) = a 2 | -------------------------------------------------------------------------------- /src/content/1.6/code/ocaml/snippet08.ml: -------------------------------------------------------------------------------- 1 | let rho_inv a = a, () 2 | -------------------------------------------------------------------------------- /src/content/1.6/code/ocaml/snippet09.ml: -------------------------------------------------------------------------------- 1 | type ('a, 'b) pair = P of 'a * 'b 2 | -------------------------------------------------------------------------------- /src/content/1.6/code/ocaml/snippet10.ml: -------------------------------------------------------------------------------- 1 | let stmt = P ("This statement is", false) 2 | -------------------------------------------------------------------------------- /src/content/1.6/code/ocaml/snippet11.ml: -------------------------------------------------------------------------------- 1 | type ('a, 'b) pair = Pair of ('a * 'b) 2 | -------------------------------------------------------------------------------- /src/content/1.6/code/ocaml/snippet12.ml: -------------------------------------------------------------------------------- 1 | let stmt = "This statement is", false 2 | -------------------------------------------------------------------------------- /src/content/1.6/code/ocaml/snippet13.ml: -------------------------------------------------------------------------------- 1 | type stmt = Stmt of string * int 2 | -------------------------------------------------------------------------------- /src/content/1.6/code/ocaml/snippet18.ml: -------------------------------------------------------------------------------- 1 | let atomic_number { atomic_number } = atomic_number 2 | -------------------------------------------------------------------------------- /src/content/1.6/code/ocaml/snippet23.ml: -------------------------------------------------------------------------------- 1 | 'a void either 2 | -------------------------------------------------------------------------------- /src/content/1.6/code/ocaml/snippet24.ml: -------------------------------------------------------------------------------- 1 | type color = 2 | | Red 3 | | Green 4 | | Blue 5 | -------------------------------------------------------------------------------- /src/content/1.6/code/ocaml/snippet25.ml: -------------------------------------------------------------------------------- 1 | type bool = 2 | | True 3 | | False 4 | -------------------------------------------------------------------------------- /src/content/1.6/code/ocaml/snippet26.ml: -------------------------------------------------------------------------------- 1 | type 'a maybe = 2 | | Nothing 3 | | Just of 'a 4 | -------------------------------------------------------------------------------- /src/content/1.6/code/ocaml/snippet27.ml: -------------------------------------------------------------------------------- 1 | type nothing_type = Nothing 2 | -------------------------------------------------------------------------------- /src/content/1.6/code/ocaml/snippet28.ml: -------------------------------------------------------------------------------- 1 | type 'a just_type = Just of 'a 2 | -------------------------------------------------------------------------------- /src/content/1.6/code/ocaml/snippet29.ml: -------------------------------------------------------------------------------- 1 | type 'a maybe = (unit, 'a) either 2 | -------------------------------------------------------------------------------- /src/content/1.6/code/ocaml/snippet30.ml: -------------------------------------------------------------------------------- 1 | type 'a list = 2 | | Nil 3 | | Cons of 'a * 'a list 4 | -------------------------------------------------------------------------------- /src/content/1.6/code/ocaml/snippet32.ml: -------------------------------------------------------------------------------- 1 | 'a * ('b, 'c) either 2 | -------------------------------------------------------------------------------- /src/content/1.6/code/ocaml/snippet33.ml: -------------------------------------------------------------------------------- 1 | ('a * 'b, 'c * 'd) either 2 | -------------------------------------------------------------------------------- /src/content/1.6/code/ocaml/snippet36.ml: -------------------------------------------------------------------------------- 1 | let prod1 = 2, Left "Hi!" 2 | -------------------------------------------------------------------------------- /src/content/1.6/code/ocaml/snippet37.ml: -------------------------------------------------------------------------------- 1 | type 'a list = 2 | | Nil 3 | | Cons of 'a * 'a list 4 | -------------------------------------------------------------------------------- /src/content/1.6/code/reason/snippet01.re: -------------------------------------------------------------------------------- 1 | let swap = ((a, b)) => (b, a); 2 | -------------------------------------------------------------------------------- /src/content/1.6/code/reason/snippet02.re: -------------------------------------------------------------------------------- 1 | (('a, 'b), 'c) -------------------------------------------------------------------------------- /src/content/1.6/code/reason/snippet03.re: -------------------------------------------------------------------------------- 1 | ('a, ('b, 'c)) -------------------------------------------------------------------------------- /src/content/1.6/code/reason/snippet04.re: -------------------------------------------------------------------------------- 1 | let alpha = (((a, b), c)) => (a, (b, c)); 2 | -------------------------------------------------------------------------------- /src/content/1.6/code/reason/snippet05.re: -------------------------------------------------------------------------------- 1 | let alpha_inv = ((a, (b, c))) => ((a, b), c); 2 | -------------------------------------------------------------------------------- /src/content/1.6/code/reason/snippet06.re: -------------------------------------------------------------------------------- 1 | ('a, unit) -------------------------------------------------------------------------------- /src/content/1.6/code/reason/snippet07.re: -------------------------------------------------------------------------------- 1 | let rho = ((a, ())) => a; 2 | -------------------------------------------------------------------------------- /src/content/1.6/code/reason/snippet08.re: -------------------------------------------------------------------------------- 1 | let rho_inv = a => (a, ()); 2 | -------------------------------------------------------------------------------- /src/content/1.6/code/reason/snippet09.re: -------------------------------------------------------------------------------- 1 | type pair('a, 'b) = 2 | | P('a, 'b); 3 | -------------------------------------------------------------------------------- /src/content/1.6/code/reason/snippet10.re: -------------------------------------------------------------------------------- 1 | let stmt = P("This statement is", false); 2 | -------------------------------------------------------------------------------- /src/content/1.6/code/reason/snippet11.re: -------------------------------------------------------------------------------- 1 | type pair('a, 'b) = 2 | | Pair(('a, 'b)); 3 | -------------------------------------------------------------------------------- /src/content/1.6/code/reason/snippet12.re: -------------------------------------------------------------------------------- 1 | let stmt = ("This statement is", false); 2 | -------------------------------------------------------------------------------- /src/content/1.6/code/reason/snippet13.re: -------------------------------------------------------------------------------- 1 | type stmt = 2 | | Stmt(string, int); 3 | -------------------------------------------------------------------------------- /src/content/1.6/code/reason/snippet18.re: -------------------------------------------------------------------------------- 1 | let atomic_number = ({atomic_number}) => atomic_number; 2 | -------------------------------------------------------------------------------- /src/content/1.6/code/reason/snippet21.re: -------------------------------------------------------------------------------- 1 | type either('a, 'b) = 2 | | Left('a) 3 | | Right('b); 4 | -------------------------------------------------------------------------------- /src/content/1.6/code/reason/snippet23.re: -------------------------------------------------------------------------------- 1 | either('a, void) -------------------------------------------------------------------------------- /src/content/1.6/code/reason/snippet24.re: -------------------------------------------------------------------------------- 1 | type color = 2 | | Red 3 | | Green 4 | | Blue; 5 | -------------------------------------------------------------------------------- /src/content/1.6/code/reason/snippet25.re: -------------------------------------------------------------------------------- 1 | type bool = 2 | | True 3 | | False; 4 | -------------------------------------------------------------------------------- /src/content/1.6/code/reason/snippet26.re: -------------------------------------------------------------------------------- 1 | type maybe('a) = 2 | | Nothing 3 | | Just('a); 4 | -------------------------------------------------------------------------------- /src/content/1.6/code/reason/snippet27.re: -------------------------------------------------------------------------------- 1 | type nothing_type = 2 | | Nothing; 3 | -------------------------------------------------------------------------------- /src/content/1.6/code/reason/snippet28.re: -------------------------------------------------------------------------------- 1 | type just_type('a) = 2 | | Just('a); 3 | -------------------------------------------------------------------------------- /src/content/1.6/code/reason/snippet29.re: -------------------------------------------------------------------------------- 1 | type maybe('a) = either(unit, 'a); 2 | -------------------------------------------------------------------------------- /src/content/1.6/code/reason/snippet30.re: -------------------------------------------------------------------------------- 1 | type list('a) = 2 | | Nil 3 | | Cons('a, list('a)); 4 | -------------------------------------------------------------------------------- /src/content/1.6/code/reason/snippet32.re: -------------------------------------------------------------------------------- 1 | ('a, either('b, 'c)) -------------------------------------------------------------------------------- /src/content/1.6/code/reason/snippet33.re: -------------------------------------------------------------------------------- 1 | either(('a, 'b), ('c, 'd)) -------------------------------------------------------------------------------- /src/content/1.6/code/reason/snippet36.re: -------------------------------------------------------------------------------- 1 | let prod1 = (2, Left("Hi!")); 2 | -------------------------------------------------------------------------------- /src/content/1.6/code/reason/snippet37.re: -------------------------------------------------------------------------------- 1 | type list('a) = 2 | | Nil 3 | | Cons('a, list('a)); 4 | -------------------------------------------------------------------------------- /src/content/1.6/code/scala/snippet02.scala: -------------------------------------------------------------------------------- 1 | ((A, B), C) -------------------------------------------------------------------------------- /src/content/1.6/code/scala/snippet03.scala: -------------------------------------------------------------------------------- 1 | (A, (B, C)) -------------------------------------------------------------------------------- /src/content/1.6/code/scala/snippet06.scala: -------------------------------------------------------------------------------- 1 | (A, Unit) -------------------------------------------------------------------------------- /src/content/1.6/code/scala/snippet08.scala: -------------------------------------------------------------------------------- 1 | def rhoInv[A]: A => (A, Unit) = 2 | x => (x, ()) -------------------------------------------------------------------------------- /src/content/1.6/code/scala/snippet11.scala: -------------------------------------------------------------------------------- 1 | case class Pair[A, B](a: A, b: B) -------------------------------------------------------------------------------- /src/content/1.6/code/scala/snippet12.scala: -------------------------------------------------------------------------------- 1 | val stmt = ("This statement is", false) -------------------------------------------------------------------------------- /src/content/1.6/code/scala/snippet13.scala: -------------------------------------------------------------------------------- 1 | case class Stmt(s: String, b: Boolean) -------------------------------------------------------------------------------- /src/content/1.6/code/scala/snippet18.scala: -------------------------------------------------------------------------------- 1 | val atomicNumber: Element => Int -------------------------------------------------------------------------------- /src/content/1.6/code/scala/snippet23.scala: -------------------------------------------------------------------------------- 1 | Either[A, Nothing] -------------------------------------------------------------------------------- /src/content/1.6/code/scala/snippet27.scala: -------------------------------------------------------------------------------- 1 | case object NoneType -------------------------------------------------------------------------------- /src/content/1.6/code/scala/snippet28.scala: -------------------------------------------------------------------------------- 1 | case class SomeType[A](a: A) -------------------------------------------------------------------------------- /src/content/1.6/code/scala/snippet29.scala: -------------------------------------------------------------------------------- 1 | type Option[A] = Either[Unit, A] -------------------------------------------------------------------------------- /src/content/1.6/code/scala/snippet32.scala: -------------------------------------------------------------------------------- 1 | (A, Either[B, C]) -------------------------------------------------------------------------------- /src/content/1.6/code/scala/snippet33.scala: -------------------------------------------------------------------------------- 1 | Either[(A, B), (A, C)] -------------------------------------------------------------------------------- /src/content/1.7/code/haskell/snippet01.hs: -------------------------------------------------------------------------------- 1 | data Maybe a = Nothing | Just a -------------------------------------------------------------------------------- /src/content/1.7/code/haskell/snippet02.hs: -------------------------------------------------------------------------------- 1 | f :: a -> b -------------------------------------------------------------------------------- /src/content/1.7/code/haskell/snippet04.hs: -------------------------------------------------------------------------------- 1 | fmap :: (a -> b) -> (Maybe a -> Maybe b) -------------------------------------------------------------------------------- /src/content/1.7/code/haskell/snippet05.hs: -------------------------------------------------------------------------------- 1 | fmap :: (a -> b) -> Maybe a -> Maybe b -------------------------------------------------------------------------------- /src/content/1.7/code/haskell/snippet06.hs: -------------------------------------------------------------------------------- 1 | fmap _ Nothing = Nothing 2 | fmap f (Just x) = Just (f x) -------------------------------------------------------------------------------- /src/content/1.7/code/haskell/snippet07.hs: -------------------------------------------------------------------------------- 1 | id x = x -------------------------------------------------------------------------------- /src/content/1.7/code/haskell/snippet08.hs: -------------------------------------------------------------------------------- 1 | fmap id = id -------------------------------------------------------------------------------- /src/content/1.7/code/haskell/snippet09.hs: -------------------------------------------------------------------------------- 1 | fmap (g . f) = fmap g . fmap f -------------------------------------------------------------------------------- /src/content/1.7/code/haskell/snippet10.hs: -------------------------------------------------------------------------------- 1 | class Eq a where 2 | (==) :: a -> a -> Bool -------------------------------------------------------------------------------- /src/content/1.7/code/haskell/snippet11.hs: -------------------------------------------------------------------------------- 1 | data Point = Pt Float Float -------------------------------------------------------------------------------- /src/content/1.7/code/haskell/snippet13.hs: -------------------------------------------------------------------------------- 1 | class Functor f where 2 | fmap :: (a -> b) -> f a -> f b -------------------------------------------------------------------------------- /src/content/1.7/code/haskell/snippet15.hs: -------------------------------------------------------------------------------- 1 | data List a = Nil | Cons a (List a) -------------------------------------------------------------------------------- /src/content/1.7/code/haskell/snippet16.hs: -------------------------------------------------------------------------------- 1 | fmap :: (a -> b) -> (List a -> List b) -------------------------------------------------------------------------------- /src/content/1.7/code/haskell/snippet17.hs: -------------------------------------------------------------------------------- 1 | fmap f (Cons x t) = Cons (f x) (fmap f t) -------------------------------------------------------------------------------- /src/content/1.7/code/haskell/snippet19.hs: -------------------------------------------------------------------------------- 1 | (->) a b -------------------------------------------------------------------------------- /src/content/1.7/code/haskell/snippet20.hs: -------------------------------------------------------------------------------- 1 | (->) a -------------------------------------------------------------------------------- /src/content/1.7/code/haskell/snippet21.hs: -------------------------------------------------------------------------------- 1 | fmap :: (a -> b) -> (r -> a) -> (r -> b) -------------------------------------------------------------------------------- /src/content/1.7/code/haskell/snippet22.hs: -------------------------------------------------------------------------------- 1 | instance Functor ((->) r) where 2 | fmap f g = f . g -------------------------------------------------------------------------------- /src/content/1.7/code/haskell/snippet23.hs: -------------------------------------------------------------------------------- 1 | fmap f g = (.) f g -------------------------------------------------------------------------------- /src/content/1.7/code/haskell/snippet24.hs: -------------------------------------------------------------------------------- 1 | fmap = (.) -------------------------------------------------------------------------------- /src/content/1.7/code/haskell/snippet25.hs: -------------------------------------------------------------------------------- 1 | nats :: [Integer] 2 | nats = [1..] -------------------------------------------------------------------------------- /src/content/1.7/code/haskell/snippet26.hs: -------------------------------------------------------------------------------- 1 | data Const c a = Const c -------------------------------------------------------------------------------- /src/content/1.7/code/haskell/snippet27.hs: -------------------------------------------------------------------------------- 1 | fmap :: (a -> b) -> Const c a -> Const c b -------------------------------------------------------------------------------- /src/content/1.7/code/haskell/snippet31.hs: -------------------------------------------------------------------------------- 1 | mis2 = (fmap . fmap) square mis -------------------------------------------------------------------------------- /src/content/1.7/code/haskell/snippet32.hs: -------------------------------------------------------------------------------- 1 | fmap :: (a -> b) -> (f a -> f b) -------------------------------------------------------------------------------- /src/content/1.7/code/haskell/snippet33.hs: -------------------------------------------------------------------------------- 1 | square :: Int -> Int -------------------------------------------------------------------------------- /src/content/1.7/code/haskell/snippet34.hs: -------------------------------------------------------------------------------- 1 | [Int] -> [Int] -------------------------------------------------------------------------------- /src/content/1.7/code/haskell/snippet35.hs: -------------------------------------------------------------------------------- 1 | Maybe [Int] -> Maybe [Int] -------------------------------------------------------------------------------- /src/content/1.7/code/ocaml/snippet01.ml: -------------------------------------------------------------------------------- 1 | type 'a option = 2 | | None 3 | | Some of 'a 4 | -------------------------------------------------------------------------------- /src/content/1.7/code/ocaml/snippet07.ml: -------------------------------------------------------------------------------- 1 | let id x = x 2 | -------------------------------------------------------------------------------- /src/content/1.7/code/ocaml/snippet11.ml: -------------------------------------------------------------------------------- 1 | type point = Pt of float * float 2 | -------------------------------------------------------------------------------- /src/content/1.7/code/ocaml/snippet15.ml: -------------------------------------------------------------------------------- 1 | type 'a list = 2 | | Nil 3 | | Cons of 'a * 'a list 4 | -------------------------------------------------------------------------------- /src/content/1.7/code/ocaml/snippet19.ml: -------------------------------------------------------------------------------- 1 | type ('a, 'b) t = 'a -> 'b 2 | -------------------------------------------------------------------------------- /src/content/1.7/code/ocaml/snippet23.ml: -------------------------------------------------------------------------------- 1 | let fmap f g = compose f g 2 | -------------------------------------------------------------------------------- /src/content/1.7/code/ocaml/snippet24.ml: -------------------------------------------------------------------------------- 1 | let fmap : ('a -> 'b) -> ('r -> 'a) -> 'r -> 'b = compose 2 | -------------------------------------------------------------------------------- /src/content/1.7/code/ocaml/snippet25.ml: -------------------------------------------------------------------------------- 1 | let nats = Caml.Stream.from (fun i -> Some (i + 1)) 2 | -------------------------------------------------------------------------------- /src/content/1.7/code/ocaml/snippet26.ml: -------------------------------------------------------------------------------- 1 | type ('c, 'a) const = Const of 'c 2 | -------------------------------------------------------------------------------- /src/content/1.7/code/ocaml/snippet34.ml: -------------------------------------------------------------------------------- 1 | int list -> int list 2 | -------------------------------------------------------------------------------- /src/content/1.7/code/ocaml/snippet35.ml: -------------------------------------------------------------------------------- 1 | int list option -> int list option 2 | -------------------------------------------------------------------------------- /src/content/1.7/code/reason/snippet01.re: -------------------------------------------------------------------------------- 1 | let compose = (f, g, x) => f(g(x)); 2 | -------------------------------------------------------------------------------- /src/content/1.7/code/reason/snippet02.re: -------------------------------------------------------------------------------- 1 | type option('a) = 2 | | None 3 | | Some('a); 4 | -------------------------------------------------------------------------------- /src/content/1.7/code/reason/snippet08.re: -------------------------------------------------------------------------------- 1 | let id = x => x; 2 | -------------------------------------------------------------------------------- /src/content/1.7/code/reason/snippet12.re: -------------------------------------------------------------------------------- 1 | type point = 2 | | Pt(float, float); 3 | -------------------------------------------------------------------------------- /src/content/1.7/code/reason/snippet16.re: -------------------------------------------------------------------------------- 1 | type list('a) = 2 | | Nil 3 | | Cons('a, list('a)); 4 | -------------------------------------------------------------------------------- /src/content/1.7/code/reason/snippet20.re: -------------------------------------------------------------------------------- 1 | type t('a, 'b) = 'a => 'b; 2 | -------------------------------------------------------------------------------- /src/content/1.7/code/reason/snippet25.re: -------------------------------------------------------------------------------- 1 | let nats = Caml.Stream.from(i => Some(i + 1)); 2 | -------------------------------------------------------------------------------- /src/content/1.7/code/reason/snippet26.re: -------------------------------------------------------------------------------- 1 | type const('c, 'a) = 2 | | Const('c); 3 | -------------------------------------------------------------------------------- /src/content/1.7/code/reason/snippet33.re: -------------------------------------------------------------------------------- 1 | module type Square_Signature = {let square: int => int;}; 2 | -------------------------------------------------------------------------------- /src/content/1.7/code/reason/snippet34.re: -------------------------------------------------------------------------------- 1 | list(int) => list(int) -------------------------------------------------------------------------------- /src/content/1.7/code/reason/snippet35.re: -------------------------------------------------------------------------------- 1 | option(list(int)) => option(list(int)) -------------------------------------------------------------------------------- /src/content/1.7/code/scala/snippet02.scala: -------------------------------------------------------------------------------- 1 | val f: A => B -------------------------------------------------------------------------------- /src/content/1.7/code/scala/snippet04.scala: -------------------------------------------------------------------------------- 1 | def fmap[A, B](f: A => B): (Option[A] => Option[B]) -------------------------------------------------------------------------------- /src/content/1.7/code/scala/snippet05.scala: -------------------------------------------------------------------------------- 1 | def fmap[A, B](f: A => B)(fa: Option[A]): Option[B] -------------------------------------------------------------------------------- /src/content/1.7/code/scala/snippet07.scala: -------------------------------------------------------------------------------- 1 | def identity[A](x: A) = x -------------------------------------------------------------------------------- /src/content/1.7/code/scala/snippet08.scala: -------------------------------------------------------------------------------- 1 | fmap(identity) == identity -------------------------------------------------------------------------------- /src/content/1.7/code/scala/snippet09.scala: -------------------------------------------------------------------------------- 1 | fmap(g compose f) == fmap(g) compose fmap(f) -------------------------------------------------------------------------------- /src/content/1.7/code/scala/snippet10.scala: -------------------------------------------------------------------------------- 1 | trait Eq[A]{ 2 | def ===(x: A, y: A): Boolean 3 | } -------------------------------------------------------------------------------- /src/content/1.7/code/scala/snippet11.scala: -------------------------------------------------------------------------------- 1 | case class Point(x: Float, y: Float) -------------------------------------------------------------------------------- /src/content/1.7/code/scala/snippet16.scala: -------------------------------------------------------------------------------- 1 | def fmap[A, B](f: A => B): (List[A] => List[B]) -------------------------------------------------------------------------------- /src/content/1.7/code/scala/snippet19.scala: -------------------------------------------------------------------------------- 1 | Function1[A, B] 2 | // or 3 | A => B -------------------------------------------------------------------------------- /src/content/1.7/code/scala/snippet21.scala: -------------------------------------------------------------------------------- 1 | def fmap[A, B](f: A => B)(g: R => A): (R => B) -------------------------------------------------------------------------------- /src/content/1.7/code/scala/snippet26.scala: -------------------------------------------------------------------------------- 1 | case class Const[C, A](v: C) -------------------------------------------------------------------------------- /src/content/1.7/code/scala/snippet27.scala: -------------------------------------------------------------------------------- 1 | def fmap[A, B](f: A => B)(ca: Const[C, A]): Const[C, B] -------------------------------------------------------------------------------- /src/content/1.7/code/scala/snippet32.scala: -------------------------------------------------------------------------------- 1 | def fmap[F[_], A, B]: (A => B) => (F[A] => F[B]) -------------------------------------------------------------------------------- /src/content/1.7/code/scala/snippet33.scala: -------------------------------------------------------------------------------- 1 | def square: Int => Int -------------------------------------------------------------------------------- /src/content/1.7/code/scala/snippet34.scala: -------------------------------------------------------------------------------- 1 | List[Int] => List[Int] -------------------------------------------------------------------------------- /src/content/1.7/code/scala/snippet35.scala: -------------------------------------------------------------------------------- 1 | Option[List[Int]] => Option[List[Int]] -------------------------------------------------------------------------------- /src/content/1.8/code/haskell/snippet03.hs: -------------------------------------------------------------------------------- 1 | bimap :: (a -> c) -> (b -> d) -> (a, b) -> (c, d) -------------------------------------------------------------------------------- /src/content/1.8/code/haskell/snippet05.hs: -------------------------------------------------------------------------------- 1 | data Identity a = Identity a -------------------------------------------------------------------------------- /src/content/1.8/code/haskell/snippet07.hs: -------------------------------------------------------------------------------- 1 | data Maybe a = Nothing | Just a -------------------------------------------------------------------------------- /src/content/1.8/code/haskell/snippet08.hs: -------------------------------------------------------------------------------- 1 | type Maybe a = Either (Const () a) (Identity a) -------------------------------------------------------------------------------- /src/content/1.8/code/haskell/snippet09.hs: -------------------------------------------------------------------------------- 1 | newtype BiComp bf fu gu a b = BiComp (bf (fu a) (gu b)) -------------------------------------------------------------------------------- /src/content/1.8/code/haskell/snippet11.hs: -------------------------------------------------------------------------------- 1 | bf (fu a) (gu b) -------------------------------------------------------------------------------- /src/content/1.8/code/haskell/snippet12.hs: -------------------------------------------------------------------------------- 1 | f1 :: a -> a' 2 | f2 :: b -> b' -------------------------------------------------------------------------------- /src/content/1.8/code/haskell/snippet16.hs: -------------------------------------------------------------------------------- 1 | type Writer a = (a, String) -------------------------------------------------------------------------------- /src/content/1.8/code/haskell/snippet18.hs: -------------------------------------------------------------------------------- 1 | return :: a -> Writer a 2 | return x = (x, "") -------------------------------------------------------------------------------- /src/content/1.8/code/haskell/snippet19.hs: -------------------------------------------------------------------------------- 1 | fmap f = id >=> (\x -> return (f x)) -------------------------------------------------------------------------------- /src/content/1.8/code/haskell/snippet20.hs: -------------------------------------------------------------------------------- 1 | (->) r -------------------------------------------------------------------------------- /src/content/1.8/code/haskell/snippet21.hs: -------------------------------------------------------------------------------- 1 | type Reader r a = r -> a -------------------------------------------------------------------------------- /src/content/1.8/code/haskell/snippet22.hs: -------------------------------------------------------------------------------- 1 | instance Functor (Reader r) where 2 | fmap f g = f . g -------------------------------------------------------------------------------- /src/content/1.8/code/haskell/snippet23.hs: -------------------------------------------------------------------------------- 1 | type Op r a = a -> r -------------------------------------------------------------------------------- /src/content/1.8/code/haskell/snippet24.hs: -------------------------------------------------------------------------------- 1 | fmap :: (a -> b) -> (a -> r) -> (b -> r) -------------------------------------------------------------------------------- /src/content/1.8/code/haskell/snippet27.hs: -------------------------------------------------------------------------------- 1 | flip :: (a -> b -> c) -> (b -> a -> c) 2 | flip f y x = f x y -------------------------------------------------------------------------------- /src/content/1.8/code/haskell/snippet28.hs: -------------------------------------------------------------------------------- 1 | contramap = flip (.) -------------------------------------------------------------------------------- /src/content/1.8/code/ocaml/snippet05.ml: -------------------------------------------------------------------------------- 1 | type 'a id = Id of 'a 2 | -------------------------------------------------------------------------------- /src/content/1.8/code/ocaml/snippet07.ml: -------------------------------------------------------------------------------- 1 | type 'a option = 2 | | None 3 | | Some of 'a 4 | -------------------------------------------------------------------------------- /src/content/1.8/code/ocaml/snippet11.ml: -------------------------------------------------------------------------------- 1 | type ('a FU.t, 'b GU.t) BF.t 2 | -------------------------------------------------------------------------------- /src/content/1.8/code/ocaml/snippet12.ml: -------------------------------------------------------------------------------- 1 | val f1 : a -> a' 2 | val f2 : b -> b' 3 | -------------------------------------------------------------------------------- /src/content/1.8/code/ocaml/snippet16.ml: -------------------------------------------------------------------------------- 1 | type 'a writer = 'a * string 2 | -------------------------------------------------------------------------------- /src/content/1.8/code/ocaml/snippet21.ml: -------------------------------------------------------------------------------- 1 | type ('r, 'a) reader = 'r -> 'a 2 | -------------------------------------------------------------------------------- /src/content/1.8/code/ocaml/snippet23.ml: -------------------------------------------------------------------------------- 1 | type ('r, 'a) op = 'a -> 'r 2 | -------------------------------------------------------------------------------- /src/content/1.8/code/ocaml/snippet24.ml: -------------------------------------------------------------------------------- 1 | val fmap : 'a 'b. ('a -> 'b) -> ('a -> 'r) -> ('b -> 'r) 2 | -------------------------------------------------------------------------------- /src/content/1.8/code/ocaml/snippet27.ml: -------------------------------------------------------------------------------- 1 | let flip f b a = f a b 2 | -------------------------------------------------------------------------------- /src/content/1.8/code/reason/snippet05.re: -------------------------------------------------------------------------------- 1 | type id('a) = 2 | | Id('a); 3 | -------------------------------------------------------------------------------- /src/content/1.8/code/reason/snippet07.re: -------------------------------------------------------------------------------- 1 | type option('a) = 2 | | None 3 | | Some('a); 4 | -------------------------------------------------------------------------------- /src/content/1.8/code/reason/snippet11.re: -------------------------------------------------------------------------------- 1 | BF.t(FU.t('a), GU.t('b)); -------------------------------------------------------------------------------- /src/content/1.8/code/reason/snippet12.re: -------------------------------------------------------------------------------- 1 | let f1: a => a' 2 | let f2: b => b' -------------------------------------------------------------------------------- /src/content/1.8/code/reason/snippet16.re: -------------------------------------------------------------------------------- 1 | type writer('a) = ('a, string); 2 | -------------------------------------------------------------------------------- /src/content/1.8/code/reason/snippet21.re: -------------------------------------------------------------------------------- 1 | type reader('r, 'a) = 'r => 'a; 2 | -------------------------------------------------------------------------------- /src/content/1.8/code/reason/snippet23.re: -------------------------------------------------------------------------------- 1 | type op('r, 'a) = 'a => 'r; 2 | -------------------------------------------------------------------------------- /src/content/1.8/code/reason/snippet24.re: -------------------------------------------------------------------------------- 1 | let fmap: 'a, 'b . ('a => 'b) => ('a => 'r) => ('b => 'r) -------------------------------------------------------------------------------- /src/content/1.8/code/reason/snippet27.re: -------------------------------------------------------------------------------- 1 | let flip = (f, b, a) => f(a, b); 2 | -------------------------------------------------------------------------------- /src/content/1.8/code/scala/snippet05.scala: -------------------------------------------------------------------------------- 1 | type Id[A] = A -------------------------------------------------------------------------------- /src/content/1.8/code/scala/snippet08.scala: -------------------------------------------------------------------------------- 1 | type Option[A] = Either[Const[Unit, A], Id[A]] -------------------------------------------------------------------------------- /src/content/1.8/code/scala/snippet11.scala: -------------------------------------------------------------------------------- 1 | BF[FU[A], GU[B]] -------------------------------------------------------------------------------- /src/content/1.8/code/scala/snippet12.scala: -------------------------------------------------------------------------------- 1 | def f1: A => A1 2 | def f2: B => B1 -------------------------------------------------------------------------------- /src/content/1.8/code/scala/snippet16.scala: -------------------------------------------------------------------------------- 1 | type Writer[A] = (A, String) -------------------------------------------------------------------------------- /src/content/1.8/code/scala/snippet20.scala: -------------------------------------------------------------------------------- 1 | // with Kind Projector plugin 2 | Function1[R, ?] or R => ? -------------------------------------------------------------------------------- /src/content/1.8/code/scala/snippet21.scala: -------------------------------------------------------------------------------- 1 | type Reader[R, A] = R => A -------------------------------------------------------------------------------- /src/content/1.8/code/scala/snippet23.scala: -------------------------------------------------------------------------------- 1 | type Op[R, A] = A => R -------------------------------------------------------------------------------- /src/content/1.8/code/scala/snippet24.scala: -------------------------------------------------------------------------------- 1 | def fmap[A, B]: (A => B) => (A => R) => (B => R) -------------------------------------------------------------------------------- /src/content/1.9/code/haskell/snippet01.hs: -------------------------------------------------------------------------------- 1 | a -> (b -> c) -------------------------------------------------------------------------------- /src/content/1.9/code/haskell/snippet02.hs: -------------------------------------------------------------------------------- 1 | a -> b -> c -------------------------------------------------------------------------------- /src/content/1.9/code/haskell/snippet03.hs: -------------------------------------------------------------------------------- 1 | catstr :: String -> String -> String 2 | catstr s s' = s ++ s' -------------------------------------------------------------------------------- /src/content/1.9/code/haskell/snippet04.hs: -------------------------------------------------------------------------------- 1 | catstr' s = \s' -> s ++ s' -------------------------------------------------------------------------------- /src/content/1.9/code/haskell/snippet05.hs: -------------------------------------------------------------------------------- 1 | greet :: String -> String 2 | greet = catstr "Hello " -------------------------------------------------------------------------------- /src/content/1.9/code/haskell/snippet06.hs: -------------------------------------------------------------------------------- 1 | (a, b) -> c -------------------------------------------------------------------------------- /src/content/1.9/code/haskell/snippet10.hs: -------------------------------------------------------------------------------- 1 | f :: Either Int Double -> String -------------------------------------------------------------------------------- /src/content/1.9/code/haskell/snippet12.hs: -------------------------------------------------------------------------------- 1 | eval :: ((a -> b), a) -> b -------------------------------------------------------------------------------- /src/content/1.9/code/haskell/snippet13.hs: -------------------------------------------------------------------------------- 1 | eval :: ((a -> b), a) -> b 2 | eval (f, x) = f x -------------------------------------------------------------------------------- /src/content/1.9/code/haskell/snippet14.hs: -------------------------------------------------------------------------------- 1 | Either a b -> a -------------------------------------------------------------------------------- /src/content/1.9/code/haskell/snippet15.hs: -------------------------------------------------------------------------------- 1 | absurd :: Void -> a -------------------------------------------------------------------------------- /src/content/1.9/code/ocaml/snippet01.ml: -------------------------------------------------------------------------------- 1 | 'a -> ('b -> 'c) 2 | -------------------------------------------------------------------------------- /src/content/1.9/code/ocaml/snippet02.ml: -------------------------------------------------------------------------------- 1 | 'a -> 'b -> 'c 2 | -------------------------------------------------------------------------------- /src/content/1.9/code/ocaml/snippet03.ml: -------------------------------------------------------------------------------- 1 | let catstr s s' = String.concat ~sep:"" [ s; s' ] 2 | -------------------------------------------------------------------------------- /src/content/1.9/code/ocaml/snippet04.ml: -------------------------------------------------------------------------------- 1 | let catstr s s' = String.concat ~sep:"" [ s; s' ] 2 | -------------------------------------------------------------------------------- /src/content/1.9/code/ocaml/snippet05.ml: -------------------------------------------------------------------------------- 1 | let greet = catstr "Hello" 2 | -------------------------------------------------------------------------------- /src/content/1.9/code/ocaml/snippet06.ml: -------------------------------------------------------------------------------- 1 | 'a * 'b -> 'a 2 | -------------------------------------------------------------------------------- /src/content/1.9/code/ocaml/snippet07.ml: -------------------------------------------------------------------------------- 1 | let curry f a b = f (a, b) 2 | -------------------------------------------------------------------------------- /src/content/1.9/code/ocaml/snippet08.ml: -------------------------------------------------------------------------------- 1 | let uncurry f p = f (fst p) (snd p) 2 | -------------------------------------------------------------------------------- /src/content/1.9/code/ocaml/snippet09.ml: -------------------------------------------------------------------------------- 1 | let factorizer g a b = g (a, b) 2 | -------------------------------------------------------------------------------- /src/content/1.9/code/ocaml/snippet12.ml: -------------------------------------------------------------------------------- 1 | val eval : (('a -> 'b), 'a) -> 'b 2 | -------------------------------------------------------------------------------- /src/content/1.9/code/ocaml/snippet13.ml: -------------------------------------------------------------------------------- 1 | let eval (f, a) = f a 2 | -------------------------------------------------------------------------------- /src/content/1.9/code/ocaml/snippet14.ml: -------------------------------------------------------------------------------- 1 | ('a, 'b) either -> 'a 2 | -------------------------------------------------------------------------------- /src/content/1.9/code/ocaml/snippet15.ml: -------------------------------------------------------------------------------- 1 | val absurd : void -> 'a 2 | -------------------------------------------------------------------------------- /src/content/1.9/code/reason/snippet01.re: -------------------------------------------------------------------------------- 1 | 'a => ('b => 'c) 2 | -------------------------------------------------------------------------------- /src/content/1.9/code/reason/snippet02.re: -------------------------------------------------------------------------------- 1 | 'a => 'b => 'c 2 | -------------------------------------------------------------------------------- /src/content/1.9/code/reason/snippet03.re: -------------------------------------------------------------------------------- 1 | let catstr = (s, s') => String.concat(~sep="", [s, s']); 2 | -------------------------------------------------------------------------------- /src/content/1.9/code/reason/snippet04.re: -------------------------------------------------------------------------------- 1 | let catstr = (s, s') => String.concat(~sep="", [s, s']); 2 | -------------------------------------------------------------------------------- /src/content/1.9/code/reason/snippet05.re: -------------------------------------------------------------------------------- 1 | let greet = catstr("Hello"); 2 | -------------------------------------------------------------------------------- /src/content/1.9/code/reason/snippet06.re: -------------------------------------------------------------------------------- 1 | ('a, 'b) => 'a -------------------------------------------------------------------------------- /src/content/1.9/code/reason/snippet07.re: -------------------------------------------------------------------------------- 1 | let curry = (f, a, b) => f((a, b)); 2 | -------------------------------------------------------------------------------- /src/content/1.9/code/reason/snippet08.re: -------------------------------------------------------------------------------- 1 | let uncurry = (f, p) => f(fst(p), snd(p)); 2 | -------------------------------------------------------------------------------- /src/content/1.9/code/reason/snippet09.re: -------------------------------------------------------------------------------- 1 | let factorizer = (g, a, b) => g((a, b)); 2 | -------------------------------------------------------------------------------- /src/content/1.9/code/reason/snippet12.re: -------------------------------------------------------------------------------- 1 | let eval: (('a => 'b), 'a) => 'b -------------------------------------------------------------------------------- /src/content/1.9/code/reason/snippet13.re: -------------------------------------------------------------------------------- 1 | let eval = ((f, a)) => f(a); 2 | -------------------------------------------------------------------------------- /src/content/1.9/code/reason/snippet14.re: -------------------------------------------------------------------------------- 1 | either('a, 'b) => 'a -------------------------------------------------------------------------------- /src/content/1.9/code/reason/snippet15.re: -------------------------------------------------------------------------------- 1 | let absurd: void => 'a -------------------------------------------------------------------------------- /src/content/1.9/code/scala/snippet01.scala: -------------------------------------------------------------------------------- 1 | A => (B => C) -------------------------------------------------------------------------------- /src/content/1.9/code/scala/snippet02.scala: -------------------------------------------------------------------------------- 1 | A => B => C -------------------------------------------------------------------------------- /src/content/1.9/code/scala/snippet05.scala: -------------------------------------------------------------------------------- 1 | val greet: String => String = 2 | catstr("Hello ", _) -------------------------------------------------------------------------------- /src/content/1.9/code/scala/snippet06.scala: -------------------------------------------------------------------------------- 1 | (A, B) => C -------------------------------------------------------------------------------- /src/content/1.9/code/scala/snippet10.scala: -------------------------------------------------------------------------------- 1 | val f: Either[Int, Double] => String -------------------------------------------------------------------------------- /src/content/1.9/code/scala/snippet12.scala: -------------------------------------------------------------------------------- 1 | def eval[A, B]: ((A => B), A) => B -------------------------------------------------------------------------------- /src/content/1.9/code/scala/snippet13.scala: -------------------------------------------------------------------------------- 1 | def eval[A, B]: ((A => B), A) => B = 2 | (f, x) => f(x) -------------------------------------------------------------------------------- /src/content/1.9/code/scala/snippet14.scala: -------------------------------------------------------------------------------- 1 | Either[A, B] => A -------------------------------------------------------------------------------- /src/content/1.9/code/scala/snippet15.scala: -------------------------------------------------------------------------------- 1 | def absurd[A]: Nothing => A -------------------------------------------------------------------------------- /src/content/2.1/code/haskell/snippet01.hs: -------------------------------------------------------------------------------- 1 | h = g . f -------------------------------------------------------------------------------- /src/content/2.1/code/haskell/snippet02.hs: -------------------------------------------------------------------------------- 1 | h x = let y = f x 2 | in g y -------------------------------------------------------------------------------- /src/content/2.1/code/ocaml/snippet02.ml: -------------------------------------------------------------------------------- 1 | let h x = 2 | let y = f x in 3 | g y 4 | ;; 5 | -------------------------------------------------------------------------------- /src/content/2.1/code/reason/snippet02.re: -------------------------------------------------------------------------------- 1 | let h = x => { 2 | let y = f(x); 3 | g(y); 4 | }; 5 | -------------------------------------------------------------------------------- /src/content/2.1/code/scala/snippet01.scala: -------------------------------------------------------------------------------- 1 | val h = g compose f -------------------------------------------------------------------------------- /src/content/2.1/code/scala/snippet02.scala: -------------------------------------------------------------------------------- 1 | val h = x => { 2 | val y = f(x) 3 | g(y) 4 | } -------------------------------------------------------------------------------- /src/content/2.2/code/haskell/snippet01.hs: -------------------------------------------------------------------------------- 1 | p' = p . m 2 | q' = q . m -------------------------------------------------------------------------------- /src/content/2.2/code/haskell/snippet03.hs: -------------------------------------------------------------------------------- 1 | f :: a -> b 2 | g :: a -> b -------------------------------------------------------------------------------- /src/content/2.2/code/haskell/snippet04.hs: -------------------------------------------------------------------------------- 1 | p :: c -> a 2 | q :: c -> b -------------------------------------------------------------------------------- /src/content/2.2/code/haskell/snippet05.hs: -------------------------------------------------------------------------------- 1 | q = f . p 2 | q = g . p -------------------------------------------------------------------------------- /src/content/2.2/code/haskell/snippet06.hs: -------------------------------------------------------------------------------- 1 | f . p = g . p -------------------------------------------------------------------------------- /src/content/2.2/code/haskell/snippet07.hs: -------------------------------------------------------------------------------- 1 | f (x, y) = 2 * y + x 2 | g (x, y) = y - x -------------------------------------------------------------------------------- /src/content/2.2/code/haskell/snippet08.hs: -------------------------------------------------------------------------------- 1 | p t = (t, (-2) * t) -------------------------------------------------------------------------------- /src/content/2.2/code/haskell/snippet09.hs: -------------------------------------------------------------------------------- 1 | f . p' = g . p' -------------------------------------------------------------------------------- /src/content/2.2/code/haskell/snippet10.hs: -------------------------------------------------------------------------------- 1 | p'() = (0, 0) -------------------------------------------------------------------------------- /src/content/2.2/code/haskell/snippet11.hs: -------------------------------------------------------------------------------- 1 | p' = p . h -------------------------------------------------------------------------------- /src/content/2.2/code/haskell/snippet12.hs: -------------------------------------------------------------------------------- 1 | h () = 0 -------------------------------------------------------------------------------- /src/content/2.2/code/haskell/snippet13.hs: -------------------------------------------------------------------------------- 1 | f :: a -> b 2 | g :: c -> b -------------------------------------------------------------------------------- /src/content/2.2/code/haskell/snippet14.hs: -------------------------------------------------------------------------------- 1 | p :: d -> a 2 | q :: d -> c 3 | r :: d -> b -------------------------------------------------------------------------------- /src/content/2.2/code/haskell/snippet15.hs: -------------------------------------------------------------------------------- 1 | g . q = f . p -------------------------------------------------------------------------------- /src/content/2.2/code/haskell/snippet16.hs: -------------------------------------------------------------------------------- 1 | f x = 1.23 -------------------------------------------------------------------------------- /src/content/2.2/code/haskell/snippet18.hs: -------------------------------------------------------------------------------- 1 | ToString (Either b c) ~ (b -> String, c -> String) -------------------------------------------------------------------------------- /src/content/2.2/code/haskell/snippet19.hs: -------------------------------------------------------------------------------- 1 | r -> (a, b) ~ (r -> a, r -> b) -------------------------------------------------------------------------------- /src/content/2.2/code/ocaml/snippet01.ml: -------------------------------------------------------------------------------- 1 | let p1 = compose p m 2 | let q1 = compose q m 3 | -------------------------------------------------------------------------------- /src/content/2.2/code/ocaml/snippet03.ml: -------------------------------------------------------------------------------- 1 | val f : 'a -> 'b 2 | val g : 'a -> 'b 3 | -------------------------------------------------------------------------------- /src/content/2.2/code/ocaml/snippet04.ml: -------------------------------------------------------------------------------- 1 | val p : 'c -> 'a 2 | val q : 'c -> 'b 3 | -------------------------------------------------------------------------------- /src/content/2.2/code/ocaml/snippet05.ml: -------------------------------------------------------------------------------- 1 | q = compose f p 2 | q = compose g p 3 | -------------------------------------------------------------------------------- /src/content/2.2/code/ocaml/snippet07.ml: -------------------------------------------------------------------------------- 1 | let f (x, y) = (2 * y) + x 2 | let g (x, y) = y - x 3 | -------------------------------------------------------------------------------- /src/content/2.2/code/ocaml/snippet08.ml: -------------------------------------------------------------------------------- 1 | let p t = t, -2 * t 2 | -------------------------------------------------------------------------------- /src/content/2.2/code/ocaml/snippet10.ml: -------------------------------------------------------------------------------- 1 | let p' () = 0, 0 2 | -------------------------------------------------------------------------------- /src/content/2.2/code/ocaml/snippet11.ml: -------------------------------------------------------------------------------- 1 | let p' = compose p h 2 | -------------------------------------------------------------------------------- /src/content/2.2/code/ocaml/snippet12.ml: -------------------------------------------------------------------------------- 1 | let h () = 0 2 | -------------------------------------------------------------------------------- /src/content/2.2/code/ocaml/snippet13.ml: -------------------------------------------------------------------------------- 1 | val f : 'a -> 'b 2 | val g : 'c -> 'b 3 | -------------------------------------------------------------------------------- /src/content/2.2/code/ocaml/snippet14.ml: -------------------------------------------------------------------------------- 1 | val p : 'd -> 'a 2 | val q : 'd -> 'c 3 | val r : 'd -> 'b 4 | -------------------------------------------------------------------------------- /src/content/2.2/code/ocaml/snippet15.ml: -------------------------------------------------------------------------------- 1 | compose g q = compose f p 2 | -------------------------------------------------------------------------------- /src/content/2.2/code/ocaml/snippet16.ml: -------------------------------------------------------------------------------- 1 | let f x = 1.23 2 | -------------------------------------------------------------------------------- /src/content/2.2/code/ocaml/snippet18.ml: -------------------------------------------------------------------------------- 1 | ('b 'c either) tostring ~ ('b -> string, 'c -> string) 2 | -------------------------------------------------------------------------------- /src/content/2.2/code/ocaml/snippet19.ml: -------------------------------------------------------------------------------- 1 | 'r -> ('a, 'b) ~ ('r -> 'a, 'r -> 'b) 2 | -------------------------------------------------------------------------------- /src/content/2.2/code/reason/snippet01.re: -------------------------------------------------------------------------------- 1 | let p1 = compose(p, m); 2 | let q1 = compose(q, m); 3 | -------------------------------------------------------------------------------- /src/content/2.2/code/reason/snippet03.re: -------------------------------------------------------------------------------- 1 | let f: 'a => 'b 2 | let g: 'a => 'b 3 | -------------------------------------------------------------------------------- /src/content/2.2/code/reason/snippet04.re: -------------------------------------------------------------------------------- 1 | let p: 'c => 'a 2 | let q: 'c => 'b 3 | -------------------------------------------------------------------------------- /src/content/2.2/code/reason/snippet05.re: -------------------------------------------------------------------------------- 1 | q == compose(f, p); 2 | q == compose(g, p); 3 | -------------------------------------------------------------------------------- /src/content/2.2/code/reason/snippet08.re: -------------------------------------------------------------------------------- 1 | let p = t => (t, (-2) * t); 2 | -------------------------------------------------------------------------------- /src/content/2.2/code/reason/snippet10.re: -------------------------------------------------------------------------------- 1 | let p' = () => (0, 0); 2 | -------------------------------------------------------------------------------- /src/content/2.2/code/reason/snippet11.re: -------------------------------------------------------------------------------- 1 | let p' = compose(p, h); 2 | -------------------------------------------------------------------------------- /src/content/2.2/code/reason/snippet12.re: -------------------------------------------------------------------------------- 1 | let h = () => 0; 2 | -------------------------------------------------------------------------------- /src/content/2.2/code/reason/snippet13.re: -------------------------------------------------------------------------------- 1 | let f: 'a => 'b 2 | let g: 'c => 'b 3 | -------------------------------------------------------------------------------- /src/content/2.2/code/reason/snippet14.re: -------------------------------------------------------------------------------- 1 | let p: 'd => 'a 2 | let q: 'd => 'c 3 | let r: 'd => 'b 4 | -------------------------------------------------------------------------------- /src/content/2.2/code/reason/snippet15.re: -------------------------------------------------------------------------------- 1 | compose(g, q) == compose(f, p); 2 | -------------------------------------------------------------------------------- /src/content/2.2/code/reason/snippet16.re: -------------------------------------------------------------------------------- 1 | let f = x => 1.23; 2 | -------------------------------------------------------------------------------- /src/content/2.2/code/reason/snippet18.re: -------------------------------------------------------------------------------- 1 | toString((either('b, 'c))) ~ (b => string, c => string) -------------------------------------------------------------------------------- /src/content/2.2/code/reason/snippet19.re: -------------------------------------------------------------------------------- 1 | 'r => ('a, 'b) ~ ('r => 'a, 'r => 'b) -------------------------------------------------------------------------------- /src/content/2.2/code/scala/snippet01.scala: -------------------------------------------------------------------------------- 1 | val p1 = p compose m 2 | val q1 = q compose m -------------------------------------------------------------------------------- /src/content/2.2/code/scala/snippet03.scala: -------------------------------------------------------------------------------- 1 | val f : A => B 2 | val g : A => B -------------------------------------------------------------------------------- /src/content/2.2/code/scala/snippet04.scala: -------------------------------------------------------------------------------- 1 | val p : C => A 2 | val q : C => B -------------------------------------------------------------------------------- /src/content/2.2/code/scala/snippet05.scala: -------------------------------------------------------------------------------- 1 | q == f compose p 2 | q == g compose p -------------------------------------------------------------------------------- /src/content/2.2/code/scala/snippet06.scala: -------------------------------------------------------------------------------- 1 | f compose p == g compose p -------------------------------------------------------------------------------- /src/content/2.2/code/scala/snippet07.scala: -------------------------------------------------------------------------------- 1 | def f(x, y) = 2 * y + x 2 | def g(x, y) = y - x -------------------------------------------------------------------------------- /src/content/2.2/code/scala/snippet08.scala: -------------------------------------------------------------------------------- 1 | def p(t) = (t, (-2) * t) -------------------------------------------------------------------------------- /src/content/2.2/code/scala/snippet09.scala: -------------------------------------------------------------------------------- 1 | f compose p1 == g compose p1 -------------------------------------------------------------------------------- /src/content/2.2/code/scala/snippet10.scala: -------------------------------------------------------------------------------- 1 | def p1 : Unit => (Double, Double) = _ => (0, 0) -------------------------------------------------------------------------------- /src/content/2.2/code/scala/snippet11.scala: -------------------------------------------------------------------------------- 1 | val p1 = p compose h -------------------------------------------------------------------------------- /src/content/2.2/code/scala/snippet12.scala: -------------------------------------------------------------------------------- 1 | def h(_,_) = 0 -------------------------------------------------------------------------------- /src/content/2.2/code/scala/snippet13.scala: -------------------------------------------------------------------------------- 1 | val f : A => B 2 | val g : C => B -------------------------------------------------------------------------------- /src/content/2.2/code/scala/snippet14.scala: -------------------------------------------------------------------------------- 1 | val p : D => A 2 | val q : D => C 3 | val r : D => B -------------------------------------------------------------------------------- /src/content/2.2/code/scala/snippet15.scala: -------------------------------------------------------------------------------- 1 | g compose q == f compose p -------------------------------------------------------------------------------- /src/content/2.2/code/scala/snippet16.scala: -------------------------------------------------------------------------------- 1 | f(x) == 1.23 -------------------------------------------------------------------------------- /src/content/2.2/code/scala/snippet18.scala: -------------------------------------------------------------------------------- 1 | ToString[Either[B, C]] ~ (B => String, C => String) -------------------------------------------------------------------------------- /src/content/2.2/code/scala/snippet19.scala: -------------------------------------------------------------------------------- 1 | R => (A, B) ~ (R => A, R => B) -------------------------------------------------------------------------------- /src/content/2.3/code/haskell/snippet03.hs: -------------------------------------------------------------------------------- 1 | 2 * 3 = 6 2 | [2] ++ [3] = [2, 3] -- not the same as [6] 3 | -------------------------------------------------------------------------------- /src/content/2.3/code/haskell/snippet04.hs: -------------------------------------------------------------------------------- 1 | h (a * b) = h a * h b -------------------------------------------------------------------------------- /src/content/2.3/code/haskell/snippet05.hs: -------------------------------------------------------------------------------- 1 | [2] ++ [3] = [2, 3] -------------------------------------------------------------------------------- /src/content/2.3/code/haskell/snippet06.hs: -------------------------------------------------------------------------------- 1 | 2 * 3 = 6 -------------------------------------------------------------------------------- /src/content/2.3/code/haskell/snippet07.hs: -------------------------------------------------------------------------------- 1 | p :: x -> U m -------------------------------------------------------------------------------- /src/content/2.3/code/haskell/snippet08.hs: -------------------------------------------------------------------------------- 1 | q :: x -> U n -------------------------------------------------------------------------------- /src/content/2.3/code/haskell/snippet09.hs: -------------------------------------------------------------------------------- 1 | h :: m -> n -------------------------------------------------------------------------------- /src/content/2.3/code/haskell/snippet10.hs: -------------------------------------------------------------------------------- 1 | q = U h . p -------------------------------------------------------------------------------- /src/content/2.3/code/ocaml/snippet03.ml: -------------------------------------------------------------------------------- 1 | 2 * 3 = 6 2 | List.append [2] [3] = [2; 3] 3 | -------------------------------------------------------------------------------- /src/content/2.3/code/ocaml/snippet04.ml: -------------------------------------------------------------------------------- 1 | let h (a * b) = h a * h b 2 | -------------------------------------------------------------------------------- /src/content/2.3/code/ocaml/snippet05.ml: -------------------------------------------------------------------------------- 1 | List.append [2] [3] = [2; 3] 2 | -------------------------------------------------------------------------------- /src/content/2.3/code/ocaml/snippet06.ml: -------------------------------------------------------------------------------- 1 | 2 * 3 = 6 2 | -------------------------------------------------------------------------------- /src/content/2.3/code/ocaml/snippet09.ml: -------------------------------------------------------------------------------- 1 | val h : m -> n 2 | -------------------------------------------------------------------------------- /src/content/2.3/code/ocaml/snippet10.ml: -------------------------------------------------------------------------------- 1 | val q = compose uh p 2 | -------------------------------------------------------------------------------- /src/content/2.3/code/reason/snippet03.re: -------------------------------------------------------------------------------- 1 | 2 * 3 == 6 2 | List.append([2], [3]) == [2, 3]; 3 | -------------------------------------------------------------------------------- /src/content/2.3/code/reason/snippet04.re: -------------------------------------------------------------------------------- 1 | let h (a * b) = h a * h b -------------------------------------------------------------------------------- /src/content/2.3/code/reason/snippet05.re: -------------------------------------------------------------------------------- 1 | List.append([2], [3]) == [2, 3]; 2 | -------------------------------------------------------------------------------- /src/content/2.3/code/reason/snippet06.re: -------------------------------------------------------------------------------- 1 | 2 * 3 == 6; 2 | -------------------------------------------------------------------------------- /src/content/2.3/code/reason/snippet09.re: -------------------------------------------------------------------------------- 1 | let h: m => n 2 | -------------------------------------------------------------------------------- /src/content/2.3/code/reason/snippet10.re: -------------------------------------------------------------------------------- 1 | let q: compose(uh p) 2 | -------------------------------------------------------------------------------- /src/content/2.3/code/scala/snippet03.scala: -------------------------------------------------------------------------------- 1 | 2 * 3 == 6 2 | List(2) ++ List(3) == List(2, 3) -------------------------------------------------------------------------------- /src/content/2.3/code/scala/snippet04.scala: -------------------------------------------------------------------------------- 1 | h(a * b) == h(a) * h(b) -------------------------------------------------------------------------------- /src/content/2.3/code/scala/snippet05.scala: -------------------------------------------------------------------------------- 1 | List(2) ++ List(3) == List(2, 3) -------------------------------------------------------------------------------- /src/content/2.3/code/scala/snippet06.scala: -------------------------------------------------------------------------------- 1 | 2 * 3 == 6 -------------------------------------------------------------------------------- /src/content/2.3/code/scala/snippet07.scala: -------------------------------------------------------------------------------- 1 | val p: X => U[M] -------------------------------------------------------------------------------- /src/content/2.3/code/scala/snippet08.scala: -------------------------------------------------------------------------------- 1 | val q: X => U[N] -------------------------------------------------------------------------------- /src/content/2.3/code/scala/snippet09.scala: -------------------------------------------------------------------------------- 1 | val h: M => N -------------------------------------------------------------------------------- /src/content/2.3/code/scala/snippet10.scala: -------------------------------------------------------------------------------- 1 | val q = uh compose p -------------------------------------------------------------------------------- /src/content/2.4/code/haskell/snippet01.hs: -------------------------------------------------------------------------------- 1 | type Reader a x = a -> x -------------------------------------------------------------------------------- /src/content/2.4/code/haskell/snippet02.hs: -------------------------------------------------------------------------------- 1 | instance Functor (Reader a) where 2 | fmap f h = f . h -------------------------------------------------------------------------------- /src/content/2.4/code/haskell/snippet03.hs: -------------------------------------------------------------------------------- 1 | type Op a x = x -> a -------------------------------------------------------------------------------- /src/content/2.4/code/haskell/snippet06.hs: -------------------------------------------------------------------------------- 1 | alpha :: forall x. (a -> x) -> F x -------------------------------------------------------------------------------- /src/content/2.4/code/haskell/snippet07.hs: -------------------------------------------------------------------------------- 1 | fmap f . alpha = alpha . fmap f -------------------------------------------------------------------------------- /src/content/2.4/code/haskell/snippet08.hs: -------------------------------------------------------------------------------- 1 | fmap f (alpha h) = alpha (f . h) -------------------------------------------------------------------------------- /src/content/2.4/code/haskell/snippet09.hs: -------------------------------------------------------------------------------- 1 | beta :: forall x. F x -> (a -> x) -------------------------------------------------------------------------------- /src/content/2.4/code/haskell/snippet10.hs: -------------------------------------------------------------------------------- 1 | alpha :: forall x. (Int -> x) -> [x] 2 | alpha h = map h [12] -------------------------------------------------------------------------------- /src/content/2.4/code/haskell/snippet11.hs: -------------------------------------------------------------------------------- 1 | map f (map h [12]) = map (f . h) [12] -------------------------------------------------------------------------------- /src/content/2.4/code/haskell/snippet12.hs: -------------------------------------------------------------------------------- 1 | beta :: forall x. [x] -> (Int -> x) -------------------------------------------------------------------------------- /src/content/2.4/code/haskell/snippet14.hs: -------------------------------------------------------------------------------- 1 | data Stream x = Cons x (Stream x) -------------------------------------------------------------------------------- /src/content/2.4/code/ocaml/snippet01.ml: -------------------------------------------------------------------------------- 1 | type ('a, 'x) reader = 'a -> 'x 2 | -------------------------------------------------------------------------------- /src/content/2.4/code/ocaml/snippet03.ml: -------------------------------------------------------------------------------- 1 | type ('a, 'x) op = 'x -> 'a 2 | -------------------------------------------------------------------------------- /src/content/2.4/code/ocaml/snippet07.ml: -------------------------------------------------------------------------------- 1 | compose (F.fmap f) NT.alpha = compose NT.alpha (F.fmap f) 2 | -------------------------------------------------------------------------------- /src/content/2.4/code/ocaml/snippet08.ml: -------------------------------------------------------------------------------- 1 | F.fmap f (N.alpha h) = N.alpha (compose f h) 2 | -------------------------------------------------------------------------------- /src/content/2.4/code/ocaml/snippet11.ml: -------------------------------------------------------------------------------- 1 | F.fmap f (F.fmap h [12]) = F.fmap (compose f h) [12] 2 | -------------------------------------------------------------------------------- /src/content/2.4/code/ocaml/snippet14.ml: -------------------------------------------------------------------------------- 1 | type 'a stream = Cons of 'a * 'a stream Lazy.t 2 | -------------------------------------------------------------------------------- /src/content/2.4/code/reason/snippet01.re: -------------------------------------------------------------------------------- 1 | type reader('a, 'x) = 'a => 'x; 2 | -------------------------------------------------------------------------------- /src/content/2.4/code/reason/snippet03.re: -------------------------------------------------------------------------------- 1 | type op('a, 'x) = 'x => 'a; 2 | -------------------------------------------------------------------------------- /src/content/2.4/code/reason/snippet08.re: -------------------------------------------------------------------------------- 1 | F.fmap(f, N.alpha(h)) == N.alpha(compose(f, h)); 2 | -------------------------------------------------------------------------------- /src/content/2.4/code/reason/snippet11.re: -------------------------------------------------------------------------------- 1 | F.fmap(f, F.fmap(h, [12])) == F.fmap(compose(f, h), [12]); 2 | -------------------------------------------------------------------------------- /src/content/2.4/code/reason/snippet14.re: -------------------------------------------------------------------------------- 1 | type stream('a) = 2 | | Cons('a, Lazy.t(stream('a))); 3 | -------------------------------------------------------------------------------- /src/content/2.4/code/scala/snippet01.scala: -------------------------------------------------------------------------------- 1 | type Reader[A, X] = A => X -------------------------------------------------------------------------------- /src/content/2.4/code/scala/snippet03.scala: -------------------------------------------------------------------------------- 1 | type Op[A, X] = X => A -------------------------------------------------------------------------------- /src/content/2.4/code/scala/snippet08.scala: -------------------------------------------------------------------------------- 1 | fmap(f)(alpha(h)) == alpha(f compose h) -------------------------------------------------------------------------------- /src/content/2.4/code/scala/snippet09.scala: -------------------------------------------------------------------------------- 1 | def beta[A]: F ~> (A => ?) -------------------------------------------------------------------------------- /src/content/2.4/code/scala/snippet12.scala: -------------------------------------------------------------------------------- 1 | def beta: List ~> (Int => ?) -------------------------------------------------------------------------------- /src/content/2.5/code/haskell/snippet01.hs: -------------------------------------------------------------------------------- 1 | type Reader a x = a -> x -------------------------------------------------------------------------------- /src/content/2.5/code/haskell/snippet02.hs: -------------------------------------------------------------------------------- 1 | instance Functor (Reader a) where 2 | fmap f h = f . h -------------------------------------------------------------------------------- /src/content/2.5/code/haskell/snippet03.hs: -------------------------------------------------------------------------------- 1 | alpha :: forall x . (a -> x) -> F x -------------------------------------------------------------------------------- /src/content/2.5/code/haskell/snippet04.hs: -------------------------------------------------------------------------------- 1 | alpha :: forall x . (a -> x) -> F x -------------------------------------------------------------------------------- /src/content/2.5/code/haskell/snippet05.hs: -------------------------------------------------------------------------------- 1 | alpha id :: F a -------------------------------------------------------------------------------- /src/content/2.5/code/haskell/snippet06.hs: -------------------------------------------------------------------------------- 1 | fa :: F a -------------------------------------------------------------------------------- /src/content/2.5/code/haskell/snippet07.hs: -------------------------------------------------------------------------------- 1 | alpha h = fmap h fa -------------------------------------------------------------------------------- /src/content/2.5/code/ocaml/snippet01.ml: -------------------------------------------------------------------------------- 1 | type ('a, 'x) reader = 'a -> 'x 2 | -------------------------------------------------------------------------------- /src/content/2.5/code/ocaml/snippet04.ml: -------------------------------------------------------------------------------- 1 | val alpha : (a -> 'x) -> 'x t 2 | -------------------------------------------------------------------------------- /src/content/2.5/code/ocaml/snippet05.ml: -------------------------------------------------------------------------------- 1 | alpha id : 'a f 2 | -------------------------------------------------------------------------------- /src/content/2.5/code/ocaml/snippet06.ml: -------------------------------------------------------------------------------- 1 | val fa : 'a f 2 | -------------------------------------------------------------------------------- /src/content/2.5/code/ocaml/snippet07.ml: -------------------------------------------------------------------------------- 1 | alpha h = F.fmap h fa 2 | -------------------------------------------------------------------------------- /src/content/2.5/code/reason/snippet01.re: -------------------------------------------------------------------------------- 1 | type reader('a, 'x) = 'a => 'x; 2 | -------------------------------------------------------------------------------- /src/content/2.5/code/reason/snippet04.re: -------------------------------------------------------------------------------- 1 | let alpha: (a => 'x) => t('x) 2 | -------------------------------------------------------------------------------- /src/content/2.5/code/reason/snippet05.re: -------------------------------------------------------------------------------- 1 | alpha(id) : f('a) -------------------------------------------------------------------------------- /src/content/2.5/code/reason/snippet06.re: -------------------------------------------------------------------------------- 1 | let fa: f('a) 2 | -------------------------------------------------------------------------------- /src/content/2.5/code/reason/snippet07.re: -------------------------------------------------------------------------------- 1 | alpha(h) == F.fmap(h, fa); 2 | -------------------------------------------------------------------------------- /src/content/2.5/code/scala/snippet01.scala: -------------------------------------------------------------------------------- 1 | type Reader[A, X] = A => X -------------------------------------------------------------------------------- /src/content/2.5/code/scala/snippet04.scala: -------------------------------------------------------------------------------- 1 | def alpha[A]: (A => ?) ~> F -------------------------------------------------------------------------------- /src/content/2.5/code/scala/snippet05.scala: -------------------------------------------------------------------------------- 1 | alpha(identity): F[A] -------------------------------------------------------------------------------- /src/content/2.5/code/scala/snippet06.scala: -------------------------------------------------------------------------------- 1 | def fa[A]: F[A] -------------------------------------------------------------------------------- /src/content/2.5/code/scala/snippet07.scala: -------------------------------------------------------------------------------- 1 | alpha(h) == fmap(h)(fa) -------------------------------------------------------------------------------- /src/content/2.6/code/haskell/snippet01.hs: -------------------------------------------------------------------------------- 1 | fromY :: (a -> x) -> b -> x 2 | fromY f b = f (btoa b) -------------------------------------------------------------------------------- /src/content/2.6/code/haskell/snippet02.hs: -------------------------------------------------------------------------------- 1 | fromY id :: b -> a -------------------------------------------------------------------------------- /src/content/2.6/code/scala/snippet02.scala: -------------------------------------------------------------------------------- 1 | fromY(identity): B => A -------------------------------------------------------------------------------- /src/content/3.10/code/haskell/snippet02.hs: -------------------------------------------------------------------------------- 1 | dimap f id (p b b) :: p a b -------------------------------------------------------------------------------- /src/content/3.10/code/haskell/snippet03.hs: -------------------------------------------------------------------------------- 1 | dimap id f (p a a) :: p a b -------------------------------------------------------------------------------- /src/content/3.10/code/haskell/snippet04.hs: -------------------------------------------------------------------------------- 1 | dimap id f . alpha = dimap f id . alpha -------------------------------------------------------------------------------- /src/content/3.10/code/haskell/snippet05.hs: -------------------------------------------------------------------------------- 1 | forall a. p a a -------------------------------------------------------------------------------- /src/content/3.10/code/haskell/snippet06.hs: -------------------------------------------------------------------------------- 1 | dimap f id . pi = dimap id f . pi -------------------------------------------------------------------------------- /src/content/3.10/code/haskell/snippet07.hs: -------------------------------------------------------------------------------- 1 | Profunctor p => (forall c. p c c) -> p a b -------------------------------------------------------------------------------- /src/content/3.10/code/haskell/snippet10.hs: -------------------------------------------------------------------------------- 1 | type ProdP p = forall a b. (a -> b) -> p a b -------------------------------------------------------------------------------- /src/content/3.10/code/haskell/snippet11.hs: -------------------------------------------------------------------------------- 1 | newtype DiaProd p = DiaProd (forall a. p a a) -------------------------------------------------------------------------------- /src/content/3.10/code/haskell/snippet13.hs: -------------------------------------------------------------------------------- 1 | forall a. f a -> g a -------------------------------------------------------------------------------- /src/content/3.10/code/haskell/snippet14.hs: -------------------------------------------------------------------------------- 1 | data Coend p = forall a. Coend (p a a) -------------------------------------------------------------------------------- /src/content/3.10/code/haskell/snippet15.hs: -------------------------------------------------------------------------------- 1 | data SumP p = forall a b. SumP (b -> a) (p a b) -------------------------------------------------------------------------------- /src/content/3.10/code/haskell/snippet17.hs: -------------------------------------------------------------------------------- 1 | data DiagSum p = forall a. DiagSum (p a a) -------------------------------------------------------------------------------- /src/content/3.10/code/ocaml/snippet02.ml: -------------------------------------------------------------------------------- 1 | let dimap f id (P (b, b)) : ('a, 'b) p 2 | -------------------------------------------------------------------------------- /src/content/3.10/code/ocaml/snippet03.ml: -------------------------------------------------------------------------------- 1 | let dimap id f (P (a, a)) : ('a, 'b) p 2 | -------------------------------------------------------------------------------- /src/content/3.10/code/ocaml/snippet05.ml: -------------------------------------------------------------------------------- 1 | 'a. ('a, 'a) p 2 | -------------------------------------------------------------------------------- /src/content/3.10/code/ocaml/snippet06.ml: -------------------------------------------------------------------------------- 1 | ;; 2 | compose (dimap f id) pi = compose (dimap id f) pi 3 | -------------------------------------------------------------------------------- /src/content/3.10/code/reason/snippet02.re: -------------------------------------------------------------------------------- 1 | let dimap(f, id, (P (b, b))) : p('a, 'b); -------------------------------------------------------------------------------- /src/content/3.10/code/reason/snippet03.re: -------------------------------------------------------------------------------- 1 | let dimap(id, f, (P (a, a))) : p('a, 'b); -------------------------------------------------------------------------------- /src/content/3.10/code/reason/snippet05.re: -------------------------------------------------------------------------------- 1 | 'a. p('a, 'a); -------------------------------------------------------------------------------- /src/content/3.10/code/reason/snippet06.re: -------------------------------------------------------------------------------- 1 | compose(dimap(f, id), pi) == compose(dimap(id, f), pi); 2 | -------------------------------------------------------------------------------- /src/content/3.10/code/scala/snippet02.scala: -------------------------------------------------------------------------------- 1 | dimap(f)(identity[B])(pbb): P[A, B] -------------------------------------------------------------------------------- /src/content/3.10/code/scala/snippet03.scala: -------------------------------------------------------------------------------- 1 | dimap(identity[A])(f)(paa): P[A, B] -------------------------------------------------------------------------------- /src/content/3.10/code/scala/snippet07.scala: -------------------------------------------------------------------------------- 1 | def side[P[_, _]: Profunctor]: PolyFunction1[P] => P[A, B] -------------------------------------------------------------------------------- /src/content/3.10/code/scala/snippet11.scala: -------------------------------------------------------------------------------- 1 | case class DiaProd[P[_, _]](paa: PolyFunction1[P]) -------------------------------------------------------------------------------- /src/content/3.10/code/scala/snippet14.scala: -------------------------------------------------------------------------------- 1 | trait Coend[P[_, _]] { 2 | def paa[A]: P[A, A] 3 | } -------------------------------------------------------------------------------- /src/content/3.10/code/scala/snippet17.scala: -------------------------------------------------------------------------------- 1 | trait DiagSum[P[_, _]]{ 2 | def paa[A]: P[A, A] 3 | } -------------------------------------------------------------------------------- /src/content/3.11/code/haskell/snippet01.hs: -------------------------------------------------------------------------------- 1 | newtype Ran k d a = Ran (forall i. (a -> k i) -> d i) -------------------------------------------------------------------------------- /src/content/3.11/code/haskell/snippet02.hs: -------------------------------------------------------------------------------- 1 | f :: String -> Tree Int -------------------------------------------------------------------------------- /src/content/3.11/code/haskell/snippet03.hs: -------------------------------------------------------------------------------- 1 | forall i. (a -> k i) -> i -------------------------------------------------------------------------------- /src/content/3.11/code/haskell/snippet04.hs: -------------------------------------------------------------------------------- 1 | type Lst a = forall i. Monoid i => (a -> i) -> i -------------------------------------------------------------------------------- /src/content/3.11/code/haskell/snippet06.hs: -------------------------------------------------------------------------------- 1 | data Lan k d a = forall i. Lan (k i -> a) (d i) -------------------------------------------------------------------------------- /src/content/3.11/code/haskell/snippet07.hs: -------------------------------------------------------------------------------- 1 | type Exp a b = Lan ((,) a) I b -------------------------------------------------------------------------------- /src/content/3.11/code/haskell/snippet09.hs: -------------------------------------------------------------------------------- 1 | data FreeF f a = forall i. FMap (i -> a) (f i) -------------------------------------------------------------------------------- /src/content/3.11/code/haskell/snippet11.hs: -------------------------------------------------------------------------------- 1 | newtype FreeF f a = FreeF (forall i. (a -> i) -> f i) -------------------------------------------------------------------------------- /src/content/3.11/code/ocaml/snippet02.ml: -------------------------------------------------------------------------------- 1 | val f : string -> int tree 2 | -------------------------------------------------------------------------------- /src/content/3.11/code/reason/snippet02.re: -------------------------------------------------------------------------------- 1 | let f: string => tree(int); 2 | -------------------------------------------------------------------------------- /src/content/3.11/code/scala/snippet02.scala: -------------------------------------------------------------------------------- 1 | def f: String => Tree[Int] -------------------------------------------------------------------------------- /src/content/3.11/code/scala/snippet07.scala: -------------------------------------------------------------------------------- 1 | type Exp[A, B] = Lan[(A, ?), I, B] -------------------------------------------------------------------------------- /src/content/3.11/code/scala/snippet11.scala: -------------------------------------------------------------------------------- 1 | case class FreeF[F[_], A](r: (A => ?) ~> F) -------------------------------------------------------------------------------- /src/content/3.14/code/haskell/snippet01.hs: -------------------------------------------------------------------------------- 1 | type Two = Either () () -------------------------------------------------------------------------------- /src/content/3.14/code/haskell/snippet02.hs: -------------------------------------------------------------------------------- 1 | raise :: () -> a -------------------------------------------------------------------------------- /src/content/3.14/code/haskell/snippet03.hs: -------------------------------------------------------------------------------- 1 | type Maybe a = Either () a -------------------------------------------------------------------------------- /src/content/3.14/code/haskell/snippet04.hs: -------------------------------------------------------------------------------- 1 | data Maybe a = Nothing | Just a -------------------------------------------------------------------------------- /src/content/3.14/code/ocaml/snippet02.ml: -------------------------------------------------------------------------------- 1 | val raise : unit -> 'a 2 | -------------------------------------------------------------------------------- /src/content/3.14/code/ocaml/snippet03.ml: -------------------------------------------------------------------------------- 1 | type 'a option = (unit, 'a) either 2 | -------------------------------------------------------------------------------- /src/content/3.14/code/ocaml/snippet04.ml: -------------------------------------------------------------------------------- 1 | type 'a option = 2 | | None 3 | | Some of 'a 4 | -------------------------------------------------------------------------------- /src/content/3.14/code/reason/snippet02.re: -------------------------------------------------------------------------------- 1 | let raise: unit => 'a; 2 | -------------------------------------------------------------------------------- /src/content/3.14/code/reason/snippet03.re: -------------------------------------------------------------------------------- 1 | type option('a) = either(unit, 'a); 2 | -------------------------------------------------------------------------------- /src/content/3.14/code/reason/snippet04.re: -------------------------------------------------------------------------------- 1 | type option('a) = 2 | | None 3 | | Some('a); 4 | -------------------------------------------------------------------------------- /src/content/3.14/code/scala/snippet01.scala: -------------------------------------------------------------------------------- 1 | type Two = Either[Unit, Unit] -------------------------------------------------------------------------------- /src/content/3.14/code/scala/snippet02.scala: -------------------------------------------------------------------------------- 1 | def raise: Unit => A -------------------------------------------------------------------------------- /src/content/3.14/code/scala/snippet03.scala: -------------------------------------------------------------------------------- 1 | type Option[A] = Either[Unit, A] -------------------------------------------------------------------------------- /src/content/3.2/code/haskell/snippet01.hs: -------------------------------------------------------------------------------- 1 | swap :: (a,b) -> (b,a) 2 | swap (a,b) = (b,a) -------------------------------------------------------------------------------- /src/content/3.2/code/haskell/snippet02.hs: -------------------------------------------------------------------------------- 1 | return :: d -> m d -------------------------------------------------------------------------------- /src/content/3.2/code/haskell/snippet03.hs: -------------------------------------------------------------------------------- 1 | extract :: w c -> c -------------------------------------------------------------------------------- /src/content/3.2/code/haskell/snippet08.hs: -------------------------------------------------------------------------------- 1 | fst . factorizer p q = p 2 | snd . factorizer p q = q -------------------------------------------------------------------------------- /src/content/3.2/code/haskell/snippet09.hs: -------------------------------------------------------------------------------- 1 | (,) Int Bool ~ (Int, Bool) -------------------------------------------------------------------------------- /src/content/3.2/code/ocaml/snippet01.ml: -------------------------------------------------------------------------------- 1 | let swap (a, b) = b, a 2 | -------------------------------------------------------------------------------- /src/content/3.2/code/ocaml/snippet07.ml: -------------------------------------------------------------------------------- 1 | let factorizer p q x = p x, q x 2 | -------------------------------------------------------------------------------- /src/content/3.2/code/ocaml/snippet09.ml: -------------------------------------------------------------------------------- 1 | int * bool ~ (int, bool) 2 | -------------------------------------------------------------------------------- /src/content/3.2/code/reason/snippet01.re: -------------------------------------------------------------------------------- 1 | let swap = (a, b) => (b, a); 2 | -------------------------------------------------------------------------------- /src/content/3.2/code/reason/snippet07.re: -------------------------------------------------------------------------------- 1 | let factorizer = (p, q, x) => (p(x), q(x)); 2 | -------------------------------------------------------------------------------- /src/content/3.2/code/reason/snippet09.re: -------------------------------------------------------------------------------- 1 | (int, bool) ~ (int, bool) 2 | -------------------------------------------------------------------------------- /src/content/3.2/code/scala/snippet02.scala: -------------------------------------------------------------------------------- 1 | // return is a keyword in Scala 2 | def pure[D]: D => M[D] -------------------------------------------------------------------------------- /src/content/3.2/code/scala/snippet03.scala: -------------------------------------------------------------------------------- 1 | def extract[C]: W[C] => C -------------------------------------------------------------------------------- /src/content/3.2/code/scala/snippet09.scala: -------------------------------------------------------------------------------- 1 | Product2[Int, Boolean] ~ (Int, Boolean) -------------------------------------------------------------------------------- /src/content/3.3/code/haskell/snippet01.hs: -------------------------------------------------------------------------------- 1 | type String = [Char] -------------------------------------------------------------------------------- /src/content/3.3/code/ocaml/snippet01.ml: -------------------------------------------------------------------------------- 1 | type string = char list 2 | -------------------------------------------------------------------------------- /src/content/3.3/code/reason/snippet01.re: -------------------------------------------------------------------------------- 1 | type string = list(char); 2 | -------------------------------------------------------------------------------- /src/content/3.3/code/scala/snippet01.scala: -------------------------------------------------------------------------------- 1 | type String = List[Char] -------------------------------------------------------------------------------- /src/content/3.4/code/haskell/snippet01.hs: -------------------------------------------------------------------------------- 1 | vlen = sqrt . sum . fmap (flip (^) 2) -------------------------------------------------------------------------------- /src/content/3.4/code/haskell/snippet03.hs: -------------------------------------------------------------------------------- 1 | a -> Writer w b -------------------------------------------------------------------------------- /src/content/3.4/code/haskell/snippet06.hs: -------------------------------------------------------------------------------- 1 | tell :: w -> Writer w () 2 | tell s = Writer ((), s) -------------------------------------------------------------------------------- /src/content/3.4/code/haskell/snippet08.hs: -------------------------------------------------------------------------------- 1 | f >=> g = \a -> let mb = f a 2 | in ... -------------------------------------------------------------------------------- /src/content/3.4/code/haskell/snippet09.hs: -------------------------------------------------------------------------------- 1 | (>>=) :: m a -> (a -> m b) -> m b -------------------------------------------------------------------------------- /src/content/3.4/code/haskell/snippet12.hs: -------------------------------------------------------------------------------- 1 | join :: m (m a) -> m a -------------------------------------------------------------------------------- /src/content/3.4/code/haskell/snippet13.hs: -------------------------------------------------------------------------------- 1 | ma >>= f = join (fmap f ma) -------------------------------------------------------------------------------- /src/content/3.4/code/haskell/snippet15.hs: -------------------------------------------------------------------------------- 1 | fmap f ma = ma >>= \a -> return (f a) -------------------------------------------------------------------------------- /src/content/3.4/code/haskell/snippet21.hs: -------------------------------------------------------------------------------- 1 | upStr <- upCase s -------------------------------------------------------------------------------- /src/content/3.4/code/haskell/snippet24.hs: -------------------------------------------------------------------------------- 1 | (>>) :: m a -> m b -> m b 2 | m >> k = m >>= (\_ -> k) -------------------------------------------------------------------------------- /src/content/3.4/code/ocaml/snippet03.ml: -------------------------------------------------------------------------------- 1 | 'a -> ('w, 'b) writer 2 | -------------------------------------------------------------------------------- /src/content/3.4/code/ocaml/snippet06.ml: -------------------------------------------------------------------------------- 1 | let tell w = Writer ((), w) 2 | -------------------------------------------------------------------------------- /src/content/3.4/code/ocaml/snippet07.ml: -------------------------------------------------------------------------------- 1 | let (>=>) f g = fun a -> ... 2 | -------------------------------------------------------------------------------- /src/content/3.4/code/ocaml/snippet09.ml: -------------------------------------------------------------------------------- 1 | val ( >>= ) : 'a m -> ('a -> 'b m) -> 'b m 2 | -------------------------------------------------------------------------------- /src/content/3.4/code/ocaml/snippet12.ml: -------------------------------------------------------------------------------- 1 | val join : ('a m) m : 'a m 2 | -------------------------------------------------------------------------------- /src/content/3.4/code/ocaml/snippet21.ml: -------------------------------------------------------------------------------- 1 | let* up_str <- up_case s 2 | -------------------------------------------------------------------------------- /src/content/3.4/code/reason/snippet03.re: -------------------------------------------------------------------------------- 1 | 'a => writer('w, 'b) -------------------------------------------------------------------------------- /src/content/3.4/code/reason/snippet06.re: -------------------------------------------------------------------------------- 1 | let tell = w => Writer((), w); 2 | -------------------------------------------------------------------------------- /src/content/3.4/code/reason/snippet07.re: -------------------------------------------------------------------------------- 1 | let (>=>) = (f, g) => a => ... 2 | -------------------------------------------------------------------------------- /src/content/3.4/code/reason/snippet09.re: -------------------------------------------------------------------------------- 1 | let (>>=): (m('a), 'a => m('b)) => m('b); 2 | -------------------------------------------------------------------------------- /src/content/3.4/code/reason/snippet12.re: -------------------------------------------------------------------------------- 1 | let join: m(m('a)) => m('a) 2 | -------------------------------------------------------------------------------- /src/content/3.4/code/reason/snippet21.re: -------------------------------------------------------------------------------- 1 | up_str = up_case(s) -------------------------------------------------------------------------------- /src/content/3.4/code/scala/snippet03.scala: -------------------------------------------------------------------------------- 1 | A => Writer[W, B] -------------------------------------------------------------------------------- /src/content/3.4/code/scala/snippet06.scala: -------------------------------------------------------------------------------- 1 | def tell[W](s: W): Writer[W, Unit] = 2 | Writer((), s) -------------------------------------------------------------------------------- /src/content/3.4/code/scala/snippet09.scala: -------------------------------------------------------------------------------- 1 | def flatMap[A, B](ma: M[A])(f: A => M[B]): M[B] -------------------------------------------------------------------------------- /src/content/3.4/code/scala/snippet12.scala: -------------------------------------------------------------------------------- 1 | def flatten[A](mma: M[M[A]]): M[A] -------------------------------------------------------------------------------- /src/content/3.4/code/scala/snippet21.scala: -------------------------------------------------------------------------------- 1 | upStr <- upCase(s) -------------------------------------------------------------------------------- /src/content/3.5/code/haskell/snippet02.hs: -------------------------------------------------------------------------------- 1 | as >>= k = concat (fmap k as) -------------------------------------------------------------------------------- /src/content/3.5/code/haskell/snippet06.hs: -------------------------------------------------------------------------------- 1 | newtype Reader e a = Reader (e -> a) -------------------------------------------------------------------------------- /src/content/3.5/code/haskell/snippet08.hs: -------------------------------------------------------------------------------- 1 | ra >>= k = Reader (\e -> ...) -------------------------------------------------------------------------------- /src/content/3.5/code/haskell/snippet13.hs: -------------------------------------------------------------------------------- 1 | newtype Writer w a = Writer (a, w) -------------------------------------------------------------------------------- /src/content/3.5/code/haskell/snippet16.hs: -------------------------------------------------------------------------------- 1 | newtype State s a = State (s -> (a, s)) -------------------------------------------------------------------------------- /src/content/3.5/code/haskell/snippet20.hs: -------------------------------------------------------------------------------- 1 | get :: State s s 2 | get = State (\s -> (s, s)) -------------------------------------------------------------------------------- /src/content/3.5/code/haskell/snippet23.hs: -------------------------------------------------------------------------------- 1 | data Cont r a = Cont ((a -> r) -> r) -------------------------------------------------------------------------------- /src/content/3.5/code/haskell/snippet26.hs: -------------------------------------------------------------------------------- 1 | ka >>= kab = Cont (\hb -> ...) -------------------------------------------------------------------------------- /src/content/3.5/code/haskell/snippet27.hs: -------------------------------------------------------------------------------- 1 | runCont ka (\a -> ...) -------------------------------------------------------------------------------- /src/content/3.5/code/haskell/snippet30.hs: -------------------------------------------------------------------------------- 1 | getChar :: () -> IO Char -------------------------------------------------------------------------------- /src/content/3.5/code/haskell/snippet31.hs: -------------------------------------------------------------------------------- 1 | main :: IO () -------------------------------------------------------------------------------- /src/content/3.5/code/haskell/snippet32.hs: -------------------------------------------------------------------------------- 1 | main :: () -> IO () -------------------------------------------------------------------------------- /src/content/3.5/code/haskell/snippet33.hs: -------------------------------------------------------------------------------- 1 | type IO a = RealWorld -> (a, RealWorld) -------------------------------------------------------------------------------- /src/content/3.5/code/haskell/snippet34.hs: -------------------------------------------------------------------------------- 1 | type IO = State RealWorld -------------------------------------------------------------------------------- /src/content/3.5/code/haskell/snippet35.hs: -------------------------------------------------------------------------------- 1 | putStr :: String -> IO () -------------------------------------------------------------------------------- /src/content/3.5/code/haskell/snippet36.hs: -------------------------------------------------------------------------------- 1 | putStr :: String -> () -------------------------------------------------------------------------------- /src/content/3.5/code/ocaml/snippet02.ml: -------------------------------------------------------------------------------- 1 | let ( >>= ) xs k = List.concat (List.map k xs) 2 | -------------------------------------------------------------------------------- /src/content/3.5/code/ocaml/snippet06.ml: -------------------------------------------------------------------------------- 1 | type ('e, 'a) reader = Reader of ('e -> 'a) 2 | -------------------------------------------------------------------------------- /src/content/3.5/code/ocaml/snippet07.ml: -------------------------------------------------------------------------------- 1 | let run_reader (Reader f) e = f e 2 | -------------------------------------------------------------------------------- /src/content/3.5/code/ocaml/snippet08.ml: -------------------------------------------------------------------------------- 1 | let (>>=) ra k = Reader (fun e -> ...) 2 | -------------------------------------------------------------------------------- /src/content/3.5/code/ocaml/snippet13.ml: -------------------------------------------------------------------------------- 1 | type ('w, 'a) writer = Writer of ('a * 'w) 2 | -------------------------------------------------------------------------------- /src/content/3.5/code/ocaml/snippet14.ml: -------------------------------------------------------------------------------- 1 | let run_writer (Writer (a, w)) = a, w 2 | -------------------------------------------------------------------------------- /src/content/3.5/code/ocaml/snippet16.ml: -------------------------------------------------------------------------------- 1 | type ('s, 'a) state = State of ('s -> 'a * 's) 2 | -------------------------------------------------------------------------------- /src/content/3.5/code/ocaml/snippet17.ml: -------------------------------------------------------------------------------- 1 | let run_state (State f) s = f s 2 | -------------------------------------------------------------------------------- /src/content/3.5/code/ocaml/snippet20.ml: -------------------------------------------------------------------------------- 1 | let get = State (fun s -> s, s) 2 | -------------------------------------------------------------------------------- /src/content/3.5/code/ocaml/snippet21.ml: -------------------------------------------------------------------------------- 1 | let put s' = State (fun s -> (), s') 2 | -------------------------------------------------------------------------------- /src/content/3.5/code/ocaml/snippet23.ml: -------------------------------------------------------------------------------- 1 | type ('r, 'a) cont = Cont of (('a -> 'r) -> 'r) 2 | -------------------------------------------------------------------------------- /src/content/3.5/code/ocaml/snippet24.ml: -------------------------------------------------------------------------------- 1 | let run_cont (Cont k) h = k h 2 | -------------------------------------------------------------------------------- /src/content/3.5/code/ocaml/snippet26.ml: -------------------------------------------------------------------------------- 1 | let (>>=) ka kab = Cont (fun hb -> ...) 2 | -------------------------------------------------------------------------------- /src/content/3.5/code/ocaml/snippet27.ml: -------------------------------------------------------------------------------- 1 | run_cont ka (fun a -> ...) 2 | -------------------------------------------------------------------------------- /src/content/3.5/code/ocaml/snippet31.ml: -------------------------------------------------------------------------------- 1 | val main : unit io 2 | -------------------------------------------------------------------------------- /src/content/3.5/code/ocaml/snippet32.ml: -------------------------------------------------------------------------------- 1 | val main : unit -> unit io 2 | -------------------------------------------------------------------------------- /src/content/3.5/code/ocaml/snippet33.ml: -------------------------------------------------------------------------------- 1 | type 'a io = realworld -> 'a * realworld 2 | -------------------------------------------------------------------------------- /src/content/3.5/code/ocaml/snippet34.ml: -------------------------------------------------------------------------------- 1 | type 'a io = realworld state 2 | -------------------------------------------------------------------------------- /src/content/3.5/code/ocaml/snippet35.ml: -------------------------------------------------------------------------------- 1 | val put_str : string -> unit io 2 | -------------------------------------------------------------------------------- /src/content/3.5/code/ocaml/snippet36.ml: -------------------------------------------------------------------------------- 1 | val put_str : string -> unit 2 | -------------------------------------------------------------------------------- /src/content/3.5/code/reason/snippet02.re: -------------------------------------------------------------------------------- 1 | let (>>=) = (xs, k) => List.concat(List.map(k, xs)); 2 | -------------------------------------------------------------------------------- /src/content/3.5/code/reason/snippet06.re: -------------------------------------------------------------------------------- 1 | type reader('e, 'a) = 2 | | Reader('e => 'a); 3 | -------------------------------------------------------------------------------- /src/content/3.5/code/reason/snippet07.re: -------------------------------------------------------------------------------- 1 | let run_reader = (Reader(f), e) => f(e); 2 | -------------------------------------------------------------------------------- /src/content/3.5/code/reason/snippet08.re: -------------------------------------------------------------------------------- 1 | let (>>=) = (ra, k) => Reader(e => ...); 2 | -------------------------------------------------------------------------------- /src/content/3.5/code/reason/snippet13.re: -------------------------------------------------------------------------------- 1 | type writer('w, 'a) = 2 | | Writer(('a, 'w)); 3 | -------------------------------------------------------------------------------- /src/content/3.5/code/reason/snippet14.re: -------------------------------------------------------------------------------- 1 | let run_writer = (Writer(a, w)) => (a, w); 2 | -------------------------------------------------------------------------------- /src/content/3.5/code/reason/snippet16.re: -------------------------------------------------------------------------------- 1 | type state('s, 'a) = 2 | | State('s => ('a, 's)); 3 | -------------------------------------------------------------------------------- /src/content/3.5/code/reason/snippet17.re: -------------------------------------------------------------------------------- 1 | let run_state = (State(f), s) => f(s); 2 | -------------------------------------------------------------------------------- /src/content/3.5/code/reason/snippet20.re: -------------------------------------------------------------------------------- 1 | let get = State(s => (s, s)); 2 | -------------------------------------------------------------------------------- /src/content/3.5/code/reason/snippet21.re: -------------------------------------------------------------------------------- 1 | let put = s' => State(s => ((), s')); 2 | -------------------------------------------------------------------------------- /src/content/3.5/code/reason/snippet23.re: -------------------------------------------------------------------------------- 1 | type cont('r, 'a) = 2 | | Cont(('a => 'r) => 'r); 3 | -------------------------------------------------------------------------------- /src/content/3.5/code/reason/snippet24.re: -------------------------------------------------------------------------------- 1 | let run_cont = (Cont(k), h) => k(h); 2 | -------------------------------------------------------------------------------- /src/content/3.5/code/reason/snippet26.re: -------------------------------------------------------------------------------- 1 | let (>>=) = (ka, kab) => Cont(hb => ...); 2 | -------------------------------------------------------------------------------- /src/content/3.5/code/reason/snippet27.re: -------------------------------------------------------------------------------- 1 | run_cont(ka, a => ...); 2 | -------------------------------------------------------------------------------- /src/content/3.5/code/reason/snippet31.re: -------------------------------------------------------------------------------- 1 | let main: io(unit); 2 | -------------------------------------------------------------------------------- /src/content/3.5/code/reason/snippet32.re: -------------------------------------------------------------------------------- 1 | let main: unit => io(unit); 2 | -------------------------------------------------------------------------------- /src/content/3.5/code/reason/snippet33.re: -------------------------------------------------------------------------------- 1 | type io('a) = realworld => ('a, realworld); 2 | -------------------------------------------------------------------------------- /src/content/3.5/code/reason/snippet34.re: -------------------------------------------------------------------------------- 1 | type io('a) = state(realworld); 2 | -------------------------------------------------------------------------------- /src/content/3.5/code/reason/snippet35.re: -------------------------------------------------------------------------------- 1 | let put_str: string => io(unit); 2 | -------------------------------------------------------------------------------- /src/content/3.5/code/reason/snippet36.re: -------------------------------------------------------------------------------- 1 | let put_str: string => unit; 2 | -------------------------------------------------------------------------------- /src/content/3.5/code/scala/snippet06.scala: -------------------------------------------------------------------------------- 1 | case class Reader[E, A](run: E => A) -------------------------------------------------------------------------------- /src/content/3.5/code/scala/snippet13.scala: -------------------------------------------------------------------------------- 1 | case class Writer[W, A](run: (A, W)) -------------------------------------------------------------------------------- /src/content/3.5/code/scala/snippet16.scala: -------------------------------------------------------------------------------- 1 | case class State[S, A](run: S => (A, S)) -------------------------------------------------------------------------------- /src/content/3.5/code/scala/snippet20.scala: -------------------------------------------------------------------------------- 1 | def get: State[S, S] = State(s => (s, s)) -------------------------------------------------------------------------------- /src/content/3.5/code/scala/snippet21.scala: -------------------------------------------------------------------------------- 1 | def put(s1: S): State[S, Unit] = State(s => ((), s1)) -------------------------------------------------------------------------------- /src/content/3.5/code/scala/snippet23.scala: -------------------------------------------------------------------------------- 1 | case class Cont[R, A](run: (A => R) => R) -------------------------------------------------------------------------------- /src/content/3.5/code/scala/snippet27.scala: -------------------------------------------------------------------------------- 1 | runCont(ka)(a => ...) -------------------------------------------------------------------------------- /src/content/3.5/code/scala/snippet30.scala: -------------------------------------------------------------------------------- 1 | def getChar: Unit => IO[Char] 2 | -------------------------------------------------------------------------------- /src/content/3.5/code/scala/snippet31.scala: -------------------------------------------------------------------------------- 1 | def main: IO[Unit] -------------------------------------------------------------------------------- /src/content/3.5/code/scala/snippet32.scala: -------------------------------------------------------------------------------- 1 | def main: Unit => IO[Unit] -------------------------------------------------------------------------------- /src/content/3.5/code/scala/snippet33.scala: -------------------------------------------------------------------------------- 1 | type IO[A] = RealWorld => (A, RealWorld) -------------------------------------------------------------------------------- /src/content/3.5/code/scala/snippet34.scala: -------------------------------------------------------------------------------- 1 | type IO[A] = State[RealWorld, A] -------------------------------------------------------------------------------- /src/content/3.5/code/scala/snippet35.scala: -------------------------------------------------------------------------------- 1 | def putStr: String => IO[Unit] -------------------------------------------------------------------------------- /src/content/3.5/code/scala/snippet36.scala: -------------------------------------------------------------------------------- 1 | def putStr: String => Unit -------------------------------------------------------------------------------- /src/content/3.6/code/haskell/snippet01.hs: -------------------------------------------------------------------------------- 1 | f >=> g = join . fmap g . f -------------------------------------------------------------------------------- /src/content/3.6/code/haskell/snippet02.hs: -------------------------------------------------------------------------------- 1 | (f >=> g) a = join (fmap g (f a)) -------------------------------------------------------------------------------- /src/content/3.6/code/haskell/snippet04.hs: -------------------------------------------------------------------------------- 1 | mappend :: m -> (m -> m) -------------------------------------------------------------------------------- /src/content/3.6/code/haskell/snippet05.hs: -------------------------------------------------------------------------------- 1 | mu :: (m, m) -> m -------------------------------------------------------------------------------- /src/content/3.6/code/haskell/snippet06.hs: -------------------------------------------------------------------------------- 1 | eta :: () -> m -------------------------------------------------------------------------------- /src/content/3.6/code/haskell/snippet07.hs: -------------------------------------------------------------------------------- 1 | mu (x, mu (y, z)) = mu (mu (x, y), z) -------------------------------------------------------------------------------- /src/content/3.6/code/haskell/snippet08.hs: -------------------------------------------------------------------------------- 1 | (mu . bimap id mu)(x, (y, z)) -------------------------------------------------------------------------------- /src/content/3.6/code/haskell/snippet09.hs: -------------------------------------------------------------------------------- 1 | (mu . bimap mu id)((x, y), z) -------------------------------------------------------------------------------- /src/content/3.6/code/haskell/snippet10.hs: -------------------------------------------------------------------------------- 1 | mu . bimap id mu = mu . bimap mu id -------------------------------------------------------------------------------- /src/content/3.6/code/haskell/snippet12.hs: -------------------------------------------------------------------------------- 1 | mu . bimap id mu . alpha = mu . bimap mu id -------------------------------------------------------------------------------- /src/content/3.6/code/haskell/snippet13.hs: -------------------------------------------------------------------------------- 1 | mu (eta (), x) = x 2 | mu (x, eta ()) = x -------------------------------------------------------------------------------- /src/content/3.6/code/haskell/snippet15.hs: -------------------------------------------------------------------------------- 1 | lambda :: ((), a) -> a 2 | lambda ((), x) = x -------------------------------------------------------------------------------- /src/content/3.6/code/haskell/snippet16.hs: -------------------------------------------------------------------------------- 1 | rho :: (a, ()) -> a 2 | rho (x, ()) = x -------------------------------------------------------------------------------- /src/content/3.6/code/haskell/snippet17.hs: -------------------------------------------------------------------------------- 1 | mu . bimap id eta = rho 2 | mu . bimap eta id = lambda -------------------------------------------------------------------------------- /src/content/3.6/code/haskell/snippet18.hs: -------------------------------------------------------------------------------- 1 | newtype State s a = State (s -> (a, s)) -------------------------------------------------------------------------------- /src/content/3.6/code/haskell/snippet19.hs: -------------------------------------------------------------------------------- 1 | newtype Prod s a = Prod (a, s) -------------------------------------------------------------------------------- /src/content/3.6/code/haskell/snippet20.hs: -------------------------------------------------------------------------------- 1 | newtype Reader s a = Reader (s -> a) -------------------------------------------------------------------------------- /src/content/3.6/code/haskell/snippet22.hs: -------------------------------------------------------------------------------- 1 | newtype State s a = State (s -> (a, s)) -------------------------------------------------------------------------------- /src/content/3.6/code/ocaml/snippet04.ml: -------------------------------------------------------------------------------- 1 | val mappend : m -> m -> m 2 | -------------------------------------------------------------------------------- /src/content/3.6/code/ocaml/snippet05.ml: -------------------------------------------------------------------------------- 1 | val mu : (m, m) -> m 2 | -------------------------------------------------------------------------------- /src/content/3.6/code/ocaml/snippet06.ml: -------------------------------------------------------------------------------- 1 | val eta : unit -> m 2 | -------------------------------------------------------------------------------- /src/content/3.6/code/ocaml/snippet07.ml: -------------------------------------------------------------------------------- 1 | ;; 2 | mu (x, mu (y, z)) = mu (mu (x, y), z) 3 | -------------------------------------------------------------------------------- /src/content/3.6/code/ocaml/snippet08.ml: -------------------------------------------------------------------------------- 1 | ;; 2 | (compose mu (bimap id mu)) (x, (y, z)) 3 | -------------------------------------------------------------------------------- /src/content/3.6/code/ocaml/snippet09.ml: -------------------------------------------------------------------------------- 1 | ;; 2 | (compose mu (bimap mu id)) ((x, y), z) 3 | -------------------------------------------------------------------------------- /src/content/3.6/code/ocaml/snippet11.ml: -------------------------------------------------------------------------------- 1 | let alpha ((x, y), z) = x, (y, z) 2 | -------------------------------------------------------------------------------- /src/content/3.6/code/ocaml/snippet13.ml: -------------------------------------------------------------------------------- 1 | ;; 2 | mu (eta (), x) = x mu (x, eta ()) = x 3 | -------------------------------------------------------------------------------- /src/content/3.6/code/ocaml/snippet15.ml: -------------------------------------------------------------------------------- 1 | let lambda ((), x) = x 2 | -------------------------------------------------------------------------------- /src/content/3.6/code/ocaml/snippet16.ml: -------------------------------------------------------------------------------- 1 | let rho (x, ()) = x 2 | -------------------------------------------------------------------------------- /src/content/3.6/code/ocaml/snippet17.ml: -------------------------------------------------------------------------------- 1 | ;; 2 | mu.bimap id eta = rho mu.bimap eta id = lambda 3 | -------------------------------------------------------------------------------- /src/content/3.6/code/ocaml/snippet18.ml: -------------------------------------------------------------------------------- 1 | type ('s, 'a) state = State of ('s -> 'a * 's) 2 | -------------------------------------------------------------------------------- /src/content/3.6/code/ocaml/snippet19.ml: -------------------------------------------------------------------------------- 1 | type ('s, 'a) prod = Prod of 'a * 's 2 | -------------------------------------------------------------------------------- /src/content/3.6/code/ocaml/snippet20.ml: -------------------------------------------------------------------------------- 1 | type ('s, 'a) reader = Reader of ('s -> 'a) 2 | -------------------------------------------------------------------------------- /src/content/3.6/code/ocaml/snippet22.ml: -------------------------------------------------------------------------------- 1 | type ('s, 'a) state = State of ('s -> 'a * 's) 2 | -------------------------------------------------------------------------------- /src/content/3.6/code/ocaml/snippet23.ml: -------------------------------------------------------------------------------- 1 | let run_state (State f) s = f s 2 | -------------------------------------------------------------------------------- /src/content/3.6/code/reason/snippet04.re: -------------------------------------------------------------------------------- 1 | let mappend: (m, m) => m; 2 | -------------------------------------------------------------------------------- /src/content/3.6/code/reason/snippet05.re: -------------------------------------------------------------------------------- 1 | let mu: (m, m) => m; 2 | -------------------------------------------------------------------------------- /src/content/3.6/code/reason/snippet06.re: -------------------------------------------------------------------------------- 1 | let eta: unit => m = ; 2 | -------------------------------------------------------------------------------- /src/content/3.6/code/reason/snippet07.re: -------------------------------------------------------------------------------- 1 | 2 | mu((x, mu((y, z)))) == mu((mu((x, y)), z)); 3 | -------------------------------------------------------------------------------- /src/content/3.6/code/reason/snippet08.re: -------------------------------------------------------------------------------- 1 | 2 | (compose(mu, bimap(id, mu)))((x, (y, z))); 3 | -------------------------------------------------------------------------------- /src/content/3.6/code/reason/snippet09.re: -------------------------------------------------------------------------------- 1 | 2 | (compose(mu, bimap(mu, id)))(((x, y), z)); 3 | -------------------------------------------------------------------------------- /src/content/3.6/code/reason/snippet11.re: -------------------------------------------------------------------------------- 1 | let alpha = (((x, y), z)) => (x, (y, z)); 2 | -------------------------------------------------------------------------------- /src/content/3.6/code/reason/snippet13.re: -------------------------------------------------------------------------------- 1 | 2 | mu((eta(), x)) == x(mu, (x, eta())) == x; 3 | -------------------------------------------------------------------------------- /src/content/3.6/code/reason/snippet15.re: -------------------------------------------------------------------------------- 1 | let lambda = (((), x)) => x; 2 | -------------------------------------------------------------------------------- /src/content/3.6/code/reason/snippet16.re: -------------------------------------------------------------------------------- 1 | let rho = ((x, ())) => x; 2 | -------------------------------------------------------------------------------- /src/content/3.6/code/reason/snippet18.re: -------------------------------------------------------------------------------- 1 | type state('s, 'a) = 2 | | State('s => ('a, 's)); 3 | -------------------------------------------------------------------------------- /src/content/3.6/code/reason/snippet19.re: -------------------------------------------------------------------------------- 1 | type prod('s, 'a) = 2 | | Prod('a, 's); 3 | -------------------------------------------------------------------------------- /src/content/3.6/code/reason/snippet20.re: -------------------------------------------------------------------------------- 1 | type reader('s, 'a) = 2 | | Reader('s => 'a); 3 | -------------------------------------------------------------------------------- /src/content/3.6/code/reason/snippet22.re: -------------------------------------------------------------------------------- 1 | type state('s, 'a) = 2 | | State('s => ('a, 's)); 3 | -------------------------------------------------------------------------------- /src/content/3.6/code/reason/snippet23.re: -------------------------------------------------------------------------------- 1 | let run_state = (State(f), s) => f(s); 2 | -------------------------------------------------------------------------------- /src/content/3.6/code/scala/snippet02.scala: -------------------------------------------------------------------------------- 1 | (f >=> g)(a) == flatten(fmap(g)(f(a))) -------------------------------------------------------------------------------- /src/content/3.6/code/scala/snippet04.scala: -------------------------------------------------------------------------------- 1 | def combine(x: M): (M => M) -------------------------------------------------------------------------------- /src/content/3.6/code/scala/snippet05.scala: -------------------------------------------------------------------------------- 1 | def mu: ((M, M)) => M -------------------------------------------------------------------------------- /src/content/3.6/code/scala/snippet06.scala: -------------------------------------------------------------------------------- 1 | def eta: Unit => M -------------------------------------------------------------------------------- /src/content/3.6/code/scala/snippet07.scala: -------------------------------------------------------------------------------- 1 | mu (x, mu (y, z)) == mu (mu (x, y), z) -------------------------------------------------------------------------------- /src/content/3.6/code/scala/snippet08.scala: -------------------------------------------------------------------------------- 1 | mu compose bimap(identity)(mu) -------------------------------------------------------------------------------- /src/content/3.6/code/scala/snippet09.scala: -------------------------------------------------------------------------------- 1 | mu compose bimap(mu)(identity) -------------------------------------------------------------------------------- /src/content/3.6/code/scala/snippet13.scala: -------------------------------------------------------------------------------- 1 | mu(eta(), x) == x 2 | mu(x, eta()) == x -------------------------------------------------------------------------------- /src/content/3.6/code/scala/snippet18.scala: -------------------------------------------------------------------------------- 1 | case class State[S, A](run: S => (A, S)) -------------------------------------------------------------------------------- /src/content/3.6/code/scala/snippet19.scala: -------------------------------------------------------------------------------- 1 | case class Prod[S, A](run: (A, S)) -------------------------------------------------------------------------------- /src/content/3.6/code/scala/snippet20.scala: -------------------------------------------------------------------------------- 1 | case class Reader[S, A](run: S => A) -------------------------------------------------------------------------------- /src/content/3.6/code/scala/snippet22.scala: -------------------------------------------------------------------------------- 1 | case class State[S, A](run: S => (A, S)) -------------------------------------------------------------------------------- /src/content/3.7/code/haskell/snippet01.hs: -------------------------------------------------------------------------------- 1 | a -> m b -------------------------------------------------------------------------------- /src/content/3.7/code/haskell/snippet02.hs: -------------------------------------------------------------------------------- 1 | w a -> b -------------------------------------------------------------------------------- /src/content/3.7/code/haskell/snippet03.hs: -------------------------------------------------------------------------------- 1 | (=>=) :: (w a -> b) -> (w b -> c) -> (w a -> c) -------------------------------------------------------------------------------- /src/content/3.7/code/haskell/snippet04.hs: -------------------------------------------------------------------------------- 1 | extract :: w a -> a -------------------------------------------------------------------------------- /src/content/3.7/code/haskell/snippet06.hs: -------------------------------------------------------------------------------- 1 | (a, e) -> b -------------------------------------------------------------------------------- /src/content/3.7/code/haskell/snippet07.hs: -------------------------------------------------------------------------------- 1 | a -> (e -> b) -------------------------------------------------------------------------------- /src/content/3.7/code/haskell/snippet08.hs: -------------------------------------------------------------------------------- 1 | data Product e a = Prod e a deriving Functor -------------------------------------------------------------------------------- /src/content/3.7/code/haskell/snippet10.hs: -------------------------------------------------------------------------------- 1 | extract (Prod e a) = a -------------------------------------------------------------------------------- /src/content/3.7/code/haskell/snippet12.hs: -------------------------------------------------------------------------------- 1 | extend :: (w a -> b) -> w a -> w b -------------------------------------------------------------------------------- /src/content/3.7/code/haskell/snippet13.hs: -------------------------------------------------------------------------------- 1 | f =>= g = g . extend f -------------------------------------------------------------------------------- /src/content/3.7/code/haskell/snippet14.hs: -------------------------------------------------------------------------------- 1 | duplicate :: w a -> w (w a) -------------------------------------------------------------------------------- /src/content/3.7/code/haskell/snippet16.hs: -------------------------------------------------------------------------------- 1 | data Stream a = Cons a (Stream a) -------------------------------------------------------------------------------- /src/content/3.7/code/haskell/snippet18.hs: -------------------------------------------------------------------------------- 1 | extract (Cons a _) = a -------------------------------------------------------------------------------- /src/content/3.7/code/haskell/snippet19.hs: -------------------------------------------------------------------------------- 1 | duplicate (Cons a as) = Cons (Cons a as) (duplicate as) -------------------------------------------------------------------------------- /src/content/3.7/code/haskell/snippet21.hs: -------------------------------------------------------------------------------- 1 | tail :: Stream a -> Stream a 2 | tail (Cons a as) = as -------------------------------------------------------------------------------- /src/content/3.7/code/haskell/snippet26.hs: -------------------------------------------------------------------------------- 1 | destroy _ = () -------------------------------------------------------------------------------- /src/content/3.7/code/haskell/snippet27.hs: -------------------------------------------------------------------------------- 1 | split x = (f x, g x) -------------------------------------------------------------------------------- /src/content/3.7/code/haskell/snippet30.hs: -------------------------------------------------------------------------------- 1 | split x = (x, x) -------------------------------------------------------------------------------- /src/content/3.7/code/haskell/snippet31.hs: -------------------------------------------------------------------------------- 1 | data Store s a = Store (s -> a) s -------------------------------------------------------------------------------- /src/content/3.7/code/haskell/snippet32.hs: -------------------------------------------------------------------------------- 1 | counit (Prod (Reader f) s)) = f s -------------------------------------------------------------------------------- /src/content/3.7/code/haskell/snippet33.hs: -------------------------------------------------------------------------------- 1 | extract (Store f s) = f s -------------------------------------------------------------------------------- /src/content/3.7/code/haskell/snippet35.hs: -------------------------------------------------------------------------------- 1 | Store f :: s -> Store f s -------------------------------------------------------------------------------- /src/content/3.7/code/haskell/snippet36.hs: -------------------------------------------------------------------------------- 1 | duplicate (Store f s) = Store (Store f) s -------------------------------------------------------------------------------- /src/content/3.7/code/haskell/snippet38.hs: -------------------------------------------------------------------------------- 1 | a -> Store s a -------------------------------------------------------------------------------- /src/content/3.7/code/haskell/snippet39.hs: -------------------------------------------------------------------------------- 1 | set :: a -> s -> a 2 | get :: a -> s -------------------------------------------------------------------------------- /src/content/3.7/code/ocaml/snippet01.ml: -------------------------------------------------------------------------------- 1 | 'a -> 'b m 2 | -------------------------------------------------------------------------------- /src/content/3.7/code/ocaml/snippet02.ml: -------------------------------------------------------------------------------- 1 | 'a w -> 'b 2 | -------------------------------------------------------------------------------- /src/content/3.7/code/ocaml/snippet04.ml: -------------------------------------------------------------------------------- 1 | val extract : 'a w -> 'a 2 | -------------------------------------------------------------------------------- /src/content/3.7/code/ocaml/snippet06.ml: -------------------------------------------------------------------------------- 1 | 'a * 'e -> 'b 2 | -------------------------------------------------------------------------------- /src/content/3.7/code/ocaml/snippet07.ml: -------------------------------------------------------------------------------- 1 | 'a -> ('e -> 'b) 2 | -------------------------------------------------------------------------------- /src/content/3.7/code/ocaml/snippet08.ml: -------------------------------------------------------------------------------- 1 | type ('e, 'a) product = P of 'e * 'a 2 | -------------------------------------------------------------------------------- /src/content/3.7/code/ocaml/snippet10.ml: -------------------------------------------------------------------------------- 1 | let extract (P (e, a)) = a 2 | -------------------------------------------------------------------------------- /src/content/3.7/code/ocaml/snippet12.ml: -------------------------------------------------------------------------------- 1 | val extend : ('a w -> 'b) -> 'a w -> 'b w 2 | -------------------------------------------------------------------------------- /src/content/3.7/code/ocaml/snippet14.ml: -------------------------------------------------------------------------------- 1 | val duplicate : 'a w -> 'a w w 2 | -------------------------------------------------------------------------------- /src/content/3.7/code/ocaml/snippet16.ml: -------------------------------------------------------------------------------- 1 | type 'a stream = Cons of 'a * 'a stream Lazy.t 2 | -------------------------------------------------------------------------------- /src/content/3.7/code/ocaml/snippet18.ml: -------------------------------------------------------------------------------- 1 | let extract (Cons (x, _)) = x 2 | -------------------------------------------------------------------------------- /src/content/3.7/code/ocaml/snippet21.ml: -------------------------------------------------------------------------------- 1 | let tail (Cons (_, xs)) = Lazy.force xs 2 | -------------------------------------------------------------------------------- /src/content/3.7/code/ocaml/snippet26.ml: -------------------------------------------------------------------------------- 1 | let destroy _ = () 2 | -------------------------------------------------------------------------------- /src/content/3.7/code/ocaml/snippet27.ml: -------------------------------------------------------------------------------- 1 | let split x = f x, g x 2 | -------------------------------------------------------------------------------- /src/content/3.7/code/ocaml/snippet30.ml: -------------------------------------------------------------------------------- 1 | let split x = x, x 2 | -------------------------------------------------------------------------------- /src/content/3.7/code/ocaml/snippet31.ml: -------------------------------------------------------------------------------- 1 | type ('s, 'a) store = Store of (('s -> 'a) * 's) 2 | -------------------------------------------------------------------------------- /src/content/3.7/code/ocaml/snippet32.ml: -------------------------------------------------------------------------------- 1 | let counit (Prod (Reader f, s)) = f s 2 | -------------------------------------------------------------------------------- /src/content/3.7/code/ocaml/snippet33.ml: -------------------------------------------------------------------------------- 1 | let extract (Store (f, s)) = f s 2 | -------------------------------------------------------------------------------- /src/content/3.7/code/ocaml/snippet34.ml: -------------------------------------------------------------------------------- 1 | let unit a = Reader (fun s -> Prod (a, s)) 2 | -------------------------------------------------------------------------------- /src/content/3.7/code/ocaml/snippet35.ml: -------------------------------------------------------------------------------- 1 | let make_store f s = Store (f, s) 2 | -------------------------------------------------------------------------------- /src/content/3.7/code/ocaml/snippet36.ml: -------------------------------------------------------------------------------- 1 | let duplicate (Store (f, s)) = Store (make_store f, s) 2 | -------------------------------------------------------------------------------- /src/content/3.7/code/ocaml/snippet38.ml: -------------------------------------------------------------------------------- 1 | 'a -> ('s, 'a) store 2 | -------------------------------------------------------------------------------- /src/content/3.7/code/ocaml/snippet39.ml: -------------------------------------------------------------------------------- 1 | val get : 'a -> 's 2 | val set : 'a -> 's -> 'a 3 | -------------------------------------------------------------------------------- /src/content/3.7/code/reason/snippet01.re: -------------------------------------------------------------------------------- 1 | 'a => m('b); -------------------------------------------------------------------------------- /src/content/3.7/code/reason/snippet02.re: -------------------------------------------------------------------------------- 1 | w('a) => 'b; -------------------------------------------------------------------------------- /src/content/3.7/code/reason/snippet04.re: -------------------------------------------------------------------------------- 1 | let extract: w('a) => 'a; 2 | -------------------------------------------------------------------------------- /src/content/3.7/code/reason/snippet06.re: -------------------------------------------------------------------------------- 1 | (('a, 'e)) => 'b; -------------------------------------------------------------------------------- /src/content/3.7/code/reason/snippet07.re: -------------------------------------------------------------------------------- 1 | ('a, 'e) => 'b; -------------------------------------------------------------------------------- /src/content/3.7/code/reason/snippet08.re: -------------------------------------------------------------------------------- 1 | type product('e, 'a) = 2 | | P('e, 'a); 3 | -------------------------------------------------------------------------------- /src/content/3.7/code/reason/snippet10.re: -------------------------------------------------------------------------------- 1 | let extract = (P(e, a)) => a; 2 | -------------------------------------------------------------------------------- /src/content/3.7/code/reason/snippet12.re: -------------------------------------------------------------------------------- 1 | let extend: (w('a) => 'b, w('a)) => w('b); 2 | -------------------------------------------------------------------------------- /src/content/3.7/code/reason/snippet14.re: -------------------------------------------------------------------------------- 1 | let duplicate: w('a) => w(w('a)); 2 | -------------------------------------------------------------------------------- /src/content/3.7/code/reason/snippet18.re: -------------------------------------------------------------------------------- 1 | let extract = (Cons(x, _)) => x; 2 | -------------------------------------------------------------------------------- /src/content/3.7/code/reason/snippet21.re: -------------------------------------------------------------------------------- 1 | let tail = (Cons(_, xs)) => Lazy.force(xs); 2 | -------------------------------------------------------------------------------- /src/content/3.7/code/reason/snippet26.re: -------------------------------------------------------------------------------- 1 | let destroy = _ => (); 2 | -------------------------------------------------------------------------------- /src/content/3.7/code/reason/snippet27.re: -------------------------------------------------------------------------------- 1 | let split = x => (f(x), g(x)); 2 | -------------------------------------------------------------------------------- /src/content/3.7/code/reason/snippet30.re: -------------------------------------------------------------------------------- 1 | let split = x => (x, x); 2 | -------------------------------------------------------------------------------- /src/content/3.7/code/reason/snippet31.re: -------------------------------------------------------------------------------- 1 | type store('s, 'a) = 2 | | Store(('s => 'a, 's)); 3 | -------------------------------------------------------------------------------- /src/content/3.7/code/reason/snippet32.re: -------------------------------------------------------------------------------- 1 | let counit = (Prod(Reader(f), s)) => f(s); 2 | -------------------------------------------------------------------------------- /src/content/3.7/code/reason/snippet33.re: -------------------------------------------------------------------------------- 1 | let extract = (Store(f, s)) => f(s); 2 | -------------------------------------------------------------------------------- /src/content/3.7/code/reason/snippet34.re: -------------------------------------------------------------------------------- 1 | let unit = a => Reader(s => Prod(a, s)); 2 | -------------------------------------------------------------------------------- /src/content/3.7/code/reason/snippet35.re: -------------------------------------------------------------------------------- 1 | let make_store = (f, s) => Store(f, s); 2 | -------------------------------------------------------------------------------- /src/content/3.7/code/reason/snippet38.re: -------------------------------------------------------------------------------- 1 | 'a => store('s, 'a); -------------------------------------------------------------------------------- /src/content/3.7/code/reason/snippet39.re: -------------------------------------------------------------------------------- 1 | let get: 'a => 's; 2 | let set: ('a, 's) => 'a; 3 | -------------------------------------------------------------------------------- /src/content/3.7/code/scala/snippet01.scala: -------------------------------------------------------------------------------- 1 | A => M[B] -------------------------------------------------------------------------------- /src/content/3.7/code/scala/snippet02.scala: -------------------------------------------------------------------------------- 1 | W[A] => B -------------------------------------------------------------------------------- /src/content/3.7/code/scala/snippet04.scala: -------------------------------------------------------------------------------- 1 | def extract[A](wa: W[A]): A -------------------------------------------------------------------------------- /src/content/3.7/code/scala/snippet06.scala: -------------------------------------------------------------------------------- 1 | ((A, E)) => B -------------------------------------------------------------------------------- /src/content/3.7/code/scala/snippet07.scala: -------------------------------------------------------------------------------- 1 | A => (E => B) -------------------------------------------------------------------------------- /src/content/3.7/code/scala/snippet12.scala: -------------------------------------------------------------------------------- 1 | def extend[W[_], A, B]: (W[A] => B) => W[A] => W[B] -------------------------------------------------------------------------------- /src/content/3.7/code/scala/snippet14.scala: -------------------------------------------------------------------------------- 1 | def duplicate[W[_], A]: W[A] => W[W[A]] -------------------------------------------------------------------------------- /src/content/3.7/code/scala/snippet16.scala: -------------------------------------------------------------------------------- 1 | case class Stream[A](h: () => A, t: () => Stream[A]) -------------------------------------------------------------------------------- /src/content/3.7/code/scala/snippet26.scala: -------------------------------------------------------------------------------- 1 | def destroy(x: M): Unit = () -------------------------------------------------------------------------------- /src/content/3.7/code/scala/snippet27.scala: -------------------------------------------------------------------------------- 1 | def split(x: M): (M, M) = (f(x), g(x)) -------------------------------------------------------------------------------- /src/content/3.7/code/scala/snippet30.scala: -------------------------------------------------------------------------------- 1 | def split(x: M): (M, M) = (x, x) -------------------------------------------------------------------------------- /src/content/3.7/code/scala/snippet31.scala: -------------------------------------------------------------------------------- 1 | case class Store[S, A](run: S => A, s: S) -------------------------------------------------------------------------------- /src/content/3.7/code/scala/snippet38.scala: -------------------------------------------------------------------------------- 1 | A => Store[S, A] -------------------------------------------------------------------------------- /src/content/3.7/code/scala/snippet39.scala: -------------------------------------------------------------------------------- 1 | def set[A, S]: A => S => A 2 | def get[A, S]: A => S -------------------------------------------------------------------------------- /src/content/3.8/code/haskell/snippet01.hs: -------------------------------------------------------------------------------- 1 | type Algebra f a = f a -> a -------------------------------------------------------------------------------- /src/content/3.8/code/haskell/snippet02.hs: -------------------------------------------------------------------------------- 1 | data MonF a = MEmpty | MAppend a a -------------------------------------------------------------------------------- /src/content/3.8/code/haskell/snippet07.hs: -------------------------------------------------------------------------------- 1 | type RingF1 a = RingF (RingF a) -------------------------------------------------------------------------------- /src/content/3.8/code/haskell/snippet08.hs: -------------------------------------------------------------------------------- 1 | type RingF2 a = RingF (RingF (RingF a)) -------------------------------------------------------------------------------- /src/content/3.8/code/haskell/snippet09.hs: -------------------------------------------------------------------------------- 1 | type RingF2 a = RingF (RingF1 a) -------------------------------------------------------------------------------- /src/content/3.8/code/haskell/snippet10.hs: -------------------------------------------------------------------------------- 1 | newtype Fix f = Fix (f (Fix f)) -------------------------------------------------------------------------------- /src/content/3.8/code/haskell/snippet11.hs: -------------------------------------------------------------------------------- 1 | newtype Fix f = In (f (Fix f)) -------------------------------------------------------------------------------- /src/content/3.8/code/haskell/snippet12.hs: -------------------------------------------------------------------------------- 1 | Fix :: f (Fix f) -> Fix f -------------------------------------------------------------------------------- /src/content/3.8/code/haskell/snippet13.hs: -------------------------------------------------------------------------------- 1 | unFix :: Fix f -> f (Fix f) 2 | unFix (Fix x) = x -------------------------------------------------------------------------------- /src/content/3.8/code/haskell/snippet14.hs: -------------------------------------------------------------------------------- 1 | data NatF a = ZeroF | SuccF a -------------------------------------------------------------------------------- /src/content/3.8/code/haskell/snippet15.hs: -------------------------------------------------------------------------------- 1 | data Nat = Zero | Succ Nat -------------------------------------------------------------------------------- /src/content/3.8/code/haskell/snippet17.hs: -------------------------------------------------------------------------------- 1 | data NatF a = ZeroF | SuccF a -------------------------------------------------------------------------------- /src/content/3.8/code/haskell/snippet19.hs: -------------------------------------------------------------------------------- 1 | data ListF e a = NilF | ConsF e a -------------------------------------------------------------------------------- /src/content/3.8/code/haskell/snippet20.hs: -------------------------------------------------------------------------------- 1 | data List e = Nil | Cons e (List e) -------------------------------------------------------------------------------- /src/content/3.8/code/haskell/snippet22.hs: -------------------------------------------------------------------------------- 1 | length = foldr (\e n -> n + 1) 0 -------------------------------------------------------------------------------- /src/content/3.8/code/haskell/snippet24.hs: -------------------------------------------------------------------------------- 1 | sum = foldr (\e s -> e + s) 0.0 -------------------------------------------------------------------------------- /src/content/3.8/code/haskell/snippet26.hs: -------------------------------------------------------------------------------- 1 | data StreamF e a = StreamF e a 2 | deriving Functor -------------------------------------------------------------------------------- /src/content/3.8/code/haskell/snippet27.hs: -------------------------------------------------------------------------------- 1 | data Stream e = Stream e (Stream e) -------------------------------------------------------------------------------- /src/content/3.8/code/haskell/snippet29.hs: -------------------------------------------------------------------------------- 1 | primes = ana era [2..] -------------------------------------------------------------------------------- /src/content/3.8/code/haskell/snippet31.hs: -------------------------------------------------------------------------------- 1 | unfoldr :: (b -> Maybe (a, b)) -> b -> [a] -------------------------------------------------------------------------------- /src/content/3.8/code/haskell/snippet32.hs: -------------------------------------------------------------------------------- 1 | set :: a -> s -> a 2 | get :: a -> s -------------------------------------------------------------------------------- /src/content/3.8/code/haskell/snippet33.hs: -------------------------------------------------------------------------------- 1 | a -> (s, s -> a) -------------------------------------------------------------------------------- /src/content/3.8/code/haskell/snippet34.hs: -------------------------------------------------------------------------------- 1 | a -> Store s a -------------------------------------------------------------------------------- /src/content/3.8/code/haskell/snippet35.hs: -------------------------------------------------------------------------------- 1 | data Store s a = Store (s -> a) s -------------------------------------------------------------------------------- /src/content/3.8/code/ocaml/snippet07.ml: -------------------------------------------------------------------------------- 1 | type 'a ring_f1 = 'a ring_f ring_f 2 | -------------------------------------------------------------------------------- /src/content/3.8/code/ocaml/snippet08.ml: -------------------------------------------------------------------------------- 1 | type 'a ring_f2 = 'a ring_f ring_f ring_f 2 | -------------------------------------------------------------------------------- /src/content/3.8/code/ocaml/snippet09.ml: -------------------------------------------------------------------------------- 1 | type 'a ring_f2 = 'a ring_f ring_f1 2 | -------------------------------------------------------------------------------- /src/content/3.8/code/ocaml/snippet14.ml: -------------------------------------------------------------------------------- 1 | type 'a nat_f = 2 | | ZeroF 3 | | SuccF of 'a 4 | -------------------------------------------------------------------------------- /src/content/3.8/code/ocaml/snippet15.ml: -------------------------------------------------------------------------------- 1 | type nat = 2 | | Zero 3 | | Succ of nat 4 | -------------------------------------------------------------------------------- /src/content/3.8/code/ocaml/snippet17.ml: -------------------------------------------------------------------------------- 1 | type 'a nat_f = 2 | | ZeroF 3 | | SuccF of 'a 4 | -------------------------------------------------------------------------------- /src/content/3.8/code/ocaml/snippet27.ml: -------------------------------------------------------------------------------- 1 | type 'e stream = Stream of ('e * 'e stream) 2 | -------------------------------------------------------------------------------- /src/content/3.8/code/ocaml/snippet32.ml: -------------------------------------------------------------------------------- 1 | val set : 'a -> 's -> 'a 2 | val get : 'a -> 's 3 | -------------------------------------------------------------------------------- /src/content/3.8/code/ocaml/snippet33.ml: -------------------------------------------------------------------------------- 1 | (a, (s, s -> a)) 2 | -------------------------------------------------------------------------------- /src/content/3.8/code/ocaml/snippet34.ml: -------------------------------------------------------------------------------- 1 | 'a -> ('s, 'a) store 2 | -------------------------------------------------------------------------------- /src/content/3.8/code/reason/snippet07.re: -------------------------------------------------------------------------------- 1 | type ring_f1('a) = ring_f(ring_f('a)); 2 | -------------------------------------------------------------------------------- /src/content/3.8/code/reason/snippet08.re: -------------------------------------------------------------------------------- 1 | type ring_f2('a) = ring_f(ring_f(ring_f('a))); 2 | -------------------------------------------------------------------------------- /src/content/3.8/code/reason/snippet09.re: -------------------------------------------------------------------------------- 1 | type ring_f2('a) = ring_f1(ring_f('a)); 2 | -------------------------------------------------------------------------------- /src/content/3.8/code/reason/snippet14.re: -------------------------------------------------------------------------------- 1 | type nat_f('a) = 2 | | ZeroF 3 | | SuccF('a); 4 | -------------------------------------------------------------------------------- /src/content/3.8/code/reason/snippet15.re: -------------------------------------------------------------------------------- 1 | type nat = 2 | | Zero 3 | | Succ(nat); 4 | -------------------------------------------------------------------------------- /src/content/3.8/code/reason/snippet17.re: -------------------------------------------------------------------------------- 1 | type nat_f('a) = 2 | | ZeroF 3 | | SuccF('a); 4 | -------------------------------------------------------------------------------- /src/content/3.8/code/reason/snippet27.re: -------------------------------------------------------------------------------- 1 | type stream('e) = 2 | | Stream(('e, stream('e))); 3 | -------------------------------------------------------------------------------- /src/content/3.8/code/reason/snippet32.re: -------------------------------------------------------------------------------- 1 | let set: ('a, 's) => 'a; 2 | let get: 'a => 's; 3 | -------------------------------------------------------------------------------- /src/content/3.8/code/reason/snippet33.re: -------------------------------------------------------------------------------- 1 | (a, (s, s => a)); -------------------------------------------------------------------------------- /src/content/3.8/code/reason/snippet34.re: -------------------------------------------------------------------------------- 1 | 'a => store('s, 'a); -------------------------------------------------------------------------------- /src/content/3.8/code/scala/snippet01.scala: -------------------------------------------------------------------------------- 1 | type Algebra[F[_], A] = F[A] => A -------------------------------------------------------------------------------- /src/content/3.8/code/scala/snippet07.scala: -------------------------------------------------------------------------------- 1 | type RingF1[A] = RingF[RingF[A]] -------------------------------------------------------------------------------- /src/content/3.8/code/scala/snippet08.scala: -------------------------------------------------------------------------------- 1 | type RingF2[A] = RingF[RingF[RingF[A]]] -------------------------------------------------------------------------------- /src/content/3.8/code/scala/snippet09.scala: -------------------------------------------------------------------------------- 1 | type RingF2[A] = RingF[RingF1[A]] -------------------------------------------------------------------------------- /src/content/3.8/code/scala/snippet10.scala: -------------------------------------------------------------------------------- 1 | case class Fix[F[_]](x: F[Fix[F]]) -------------------------------------------------------------------------------- /src/content/3.8/code/scala/snippet27.scala: -------------------------------------------------------------------------------- 1 | case class Stream[E](h: E, t: Stream[E]) -------------------------------------------------------------------------------- /src/content/3.8/code/scala/snippet31.scala: -------------------------------------------------------------------------------- 1 | def unfoldr[A, B]: (B => Option[(A, B)]) => B => List[A] -------------------------------------------------------------------------------- /src/content/3.8/code/scala/snippet32.scala: -------------------------------------------------------------------------------- 1 | def set[A, S]: A => S => A 2 | def get[A, S]: A => S -------------------------------------------------------------------------------- /src/content/3.8/code/scala/snippet33.scala: -------------------------------------------------------------------------------- 1 | A => ((S, S => A)) -------------------------------------------------------------------------------- /src/content/3.8/code/scala/snippet34.scala: -------------------------------------------------------------------------------- 1 | A => Store[S, A] -------------------------------------------------------------------------------- /src/content/3.8/code/scala/snippet35.scala: -------------------------------------------------------------------------------- 1 | case class Store[S, A](run: S => A, s: S) -------------------------------------------------------------------------------- /src/content/3.9/code/haskell/snippet01.hs: -------------------------------------------------------------------------------- 1 | alg . return = id 2 | alg . join = alg . fmap alg -------------------------------------------------------------------------------- /src/content/3.9/code/haskell/snippet02.hs: -------------------------------------------------------------------------------- 1 | foldr :: (a -> a -> a) -> a -> [a] -> a -------------------------------------------------------------------------------- /src/content/3.9/code/haskell/snippet03.hs: -------------------------------------------------------------------------------- 1 | foldr f z [x] = x `f` z -------------------------------------------------------------------------------- /src/content/3.9/code/haskell/snippet04.hs: -------------------------------------------------------------------------------- 1 | x `f` z = x -------------------------------------------------------------------------------- /src/content/3.9/code/haskell/snippet05.hs: -------------------------------------------------------------------------------- 1 | h = join . fmap g . f -------------------------------------------------------------------------------- /src/content/3.9/code/haskell/snippet06.hs: -------------------------------------------------------------------------------- 1 | return . f -------------------------------------------------------------------------------- /src/content/3.9/code/haskell/snippet07.hs: -------------------------------------------------------------------------------- 1 | data Store s a = Store (s -> a) s -------------------------------------------------------------------------------- /src/content/3.9/code/haskell/snippet09.hs: -------------------------------------------------------------------------------- 1 | fmap g (Store f s) = Store (g . f) s -------------------------------------------------------------------------------- /src/content/3.9/code/haskell/snippet10.hs: -------------------------------------------------------------------------------- 1 | Store (coalg . set a) (get a) -------------------------------------------------------------------------------- /src/content/3.9/code/haskell/snippet11.hs: -------------------------------------------------------------------------------- 1 | Store (Store (set a)) (get a) -------------------------------------------------------------------------------- /src/content/3.9/code/haskell/snippet12.hs: -------------------------------------------------------------------------------- 1 | coalg (set a s) = Store (set a) s -------------------------------------------------------------------------------- /src/content/3.9/code/haskell/snippet13.hs: -------------------------------------------------------------------------------- 1 | Store (set (set a s)) (get (set a s)) = Store (set a) s -------------------------------------------------------------------------------- /src/content/3.9/code/haskell/snippet14.hs: -------------------------------------------------------------------------------- 1 | set (set a s) = set a -------------------------------------------------------------------------------- /src/content/3.9/code/haskell/snippet15.hs: -------------------------------------------------------------------------------- 1 | get (set a s) = s -------------------------------------------------------------------------------- /src/content/3.9/code/ocaml/snippet04.ml: -------------------------------------------------------------------------------- 1 | ;; 2 | f x z = x 3 | -------------------------------------------------------------------------------- /src/content/3.9/code/ocaml/snippet07.ml: -------------------------------------------------------------------------------- 1 | type ('s, 'a) store = Store of ('s -> 'a) * 's 2 | -------------------------------------------------------------------------------- /src/content/3.9/code/ocaml/snippet11.ml: -------------------------------------------------------------------------------- 1 | ;; 2 | Store ((fun s -> Store (set a, s)), get a) 3 | -------------------------------------------------------------------------------- /src/content/3.9/code/ocaml/snippet14.ml: -------------------------------------------------------------------------------- 1 | ;; 2 | set (set a s) = set a 3 | -------------------------------------------------------------------------------- /src/content/3.9/code/ocaml/snippet15.ml: -------------------------------------------------------------------------------- 1 | ;; 2 | get (set a s) = s 3 | -------------------------------------------------------------------------------- /src/content/3.9/code/reason/snippet02.re: -------------------------------------------------------------------------------- 1 | let fold_right: (('a, 'b) => 'b, list('a), 'b) => 'b; 2 | -------------------------------------------------------------------------------- /src/content/3.9/code/reason/snippet04.re: -------------------------------------------------------------------------------- 1 | f(x, z) == x; 2 | -------------------------------------------------------------------------------- /src/content/3.9/code/reason/snippet07.re: -------------------------------------------------------------------------------- 1 | type store('s, 'a) = 2 | | Store('s => 'a, 's); 3 | -------------------------------------------------------------------------------- /src/content/3.9/code/reason/snippet11.re: -------------------------------------------------------------------------------- 1 | Store(s => Store(set(a), s), get(a)); 2 | -------------------------------------------------------------------------------- /src/content/3.9/code/reason/snippet14.re: -------------------------------------------------------------------------------- 1 | set(set(a, s)) == set(a); 2 | -------------------------------------------------------------------------------- /src/content/3.9/code/reason/snippet15.re: -------------------------------------------------------------------------------- 1 | get(set(a, s)) == s; 2 | -------------------------------------------------------------------------------- /src/content/3.9/code/scala/snippet02.scala: -------------------------------------------------------------------------------- 1 | def foldr[A]: (A => A => A) => A => List[A] => A -------------------------------------------------------------------------------- /src/content/3.9/code/scala/snippet04.scala: -------------------------------------------------------------------------------- 1 | f(x)(z) == x -------------------------------------------------------------------------------- /src/content/3.9/code/scala/snippet05.scala: -------------------------------------------------------------------------------- 1 | h == flatten.compose(fmap(g) _ compose f) -------------------------------------------------------------------------------- /src/content/3.9/code/scala/snippet06.scala: -------------------------------------------------------------------------------- 1 | unit compose f -------------------------------------------------------------------------------- /src/content/3.9/code/scala/snippet10.scala: -------------------------------------------------------------------------------- 1 | Store(coalg compose set(a), get(a)) -------------------------------------------------------------------------------- /src/content/3.9/code/scala/snippet11.scala: -------------------------------------------------------------------------------- 1 | Store(Store(set(a)), get(a)) -------------------------------------------------------------------------------- /src/content/3.9/code/scala/snippet12.scala: -------------------------------------------------------------------------------- 1 | coalg(set(a)(s)) == Store(set(a))(s) -------------------------------------------------------------------------------- /src/content/3.9/code/scala/snippet14.scala: -------------------------------------------------------------------------------- 1 | set(set(a)(s)) == set(a) -------------------------------------------------------------------------------- /src/content/3.9/code/scala/snippet15.scala: -------------------------------------------------------------------------------- 1 | get(set(a)(s)) == s -------------------------------------------------------------------------------- /src/ctfp-print-ocaml.tex: -------------------------------------------------------------------------------- 1 | \input{opt-ocaml} 2 | \input{ctfp-print} 3 | \input{postamble} -------------------------------------------------------------------------------- /src/ctfp-print-reason.tex: -------------------------------------------------------------------------------- 1 | \input{opt-reason} 2 | \input{ctfp-print} 3 | \input{postamble} -------------------------------------------------------------------------------- /src/ctfp-print-scala.tex: -------------------------------------------------------------------------------- 1 | \input{opt-scala} 2 | \input{ctfp-print} 3 | \input{postamble} -------------------------------------------------------------------------------- /src/ctfp-reader-ocaml.tex: -------------------------------------------------------------------------------- 1 | \input{opt-ocaml} 2 | \input{ctfp-reader} 3 | \input{postamble} -------------------------------------------------------------------------------- /src/ctfp-reader-reason.tex: -------------------------------------------------------------------------------- 1 | \input{opt-reason} 2 | \input{ctfp-reader} 3 | \input{postamble} -------------------------------------------------------------------------------- /src/ctfp-reader-scala.tex: -------------------------------------------------------------------------------- 1 | \input{opt-scala} 2 | \input{ctfp-reader} 3 | \input{postamble} -------------------------------------------------------------------------------- /src/postamble.tex: -------------------------------------------------------------------------------- 1 | 2 | \end{document} 3 | -------------------------------------------------------------------------------- /src/version.tex: -------------------------------------------------------------------------------- 1 | \newcommand\OPTversion{dev} --------------------------------------------------------------------------------