Mostly Adequate with fp-ts
1.0.0
1.0.0
  • Welcome
  • Chapter 01: What Ever Are We Doing?
  • Chapter 04: Currying
  • Chapter 05: Coding by Composing
  • Chapter 06: Example Application
  • Chapter 08: Tupperware
  • Chapter 09: Monadic Onions
  • Chapter 10: Applicative Functors
Powered by GitBook
On this page

Was this helpful?

Chapter 04: Currying

PreviousChapter 01: What Ever Are We Doing?NextChapter 05: Coding by Composing

Last updated 4 years ago

Was this helpful?

The book uses a function curry to transform a regular function it to something that can be partial applied. Unfortunately, fp-ts does not have an equivalent "auto-curry" function .

You must manually write your functions in curry format:

const match = curry((what, s) => s.match(what));
const replace = curry((what, replacement, s) => s.replace(what, replacement));
const match = (what: string | RegExp) => (s: string) => s.match(what);
const replace = (search: string | RegExp) => (replace: string) => (s: string) =>
  s.replace(search, replace);

// here's some others that will be used later on
const add = (a: number) => (b: number) => a + b;
const concat = (a: string) => (b: string) => a + b;
const toString = (a: number) => a.toString();
const split = (search: string | RegExp) => (s: string) => s.split(search);
const toLower = (s: string) => s.toLocaleLowerCase();
const head = <T>(arr: T[]): T => arr[0];

Using these functions remains the same; you just lose the flexibility of calling it either way.

Map

const map = curry((f, xs) => xs.map(f));
const getChildren = x => x.childNodes;
const allTheChildren = map(getChildren);
import { map } from "fp-ts/ReadonlyArray";
const getChildren = (x: HTMLElement) => x.childNodes;
const allTheChildren = map(getChildren);

One key difference between the book and fp-ts is that the book uses a single generic map function. In order to maintain type safety, fp-ts provides a specific map functions for each functor.

In the above example, we need to map over an array, so we import fromfp-ts/ReadonlyArray.

because it's not possible to do so and retain complete types