Fix typos (#23)

* ✏️  Fix typos in exo0

* ✏️  Fix typos in exo1

* ✏️  Fix typo in exo2

* ✏️  Fix typo on "Exercise"
This commit is contained in:
Laure Retru-Chavastel 2022-04-20 09:05:56 +02:00 committed by GitHub
parent eee540212f
commit db715ba88c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 22 additions and 21 deletions

View file

@ -3,10 +3,10 @@
This repo is a work in progress toward having a comprehensive training material This repo is a work in progress toward having a comprehensive training material
to onboard people on using `fp-ts` efficiently. to onboard people on using `fp-ts` efficiently.
The exercices consist of unimplemented functions and their associated failing The exercises consist of unimplemented functions and their associated failing
tests. tests.
But first, it is essential to understand why we are using `fp-ts`. I suggest you read this [article](https://medium.com/inato/our-journey-to-functional-programing-36854a370de1) and then start the exercices. But first, it is essential to understand why we are using `fp-ts`. I suggest you read this [article](https://medium.com/inato/our-journey-to-functional-programing-36854a370de1) and then start the exercises.
To run the tests, simply run To run the tests, simply run
@ -20,14 +20,14 @@ You can also run them in watch mode:
$ yarn test:watch $ yarn test:watch
``` ```
Finally, if you wish to only run the tests for a given exercice `exoN`, you can Finally, if you wish to only run the tests for a given exercise `exoN`, you can
run the following: run the following:
```sh ```sh
$ yarn test[:watch] exoN $ yarn test[:watch] exoN
``` ```
The exercices are organized into `exoN` folders and most of what is required to The exercises are organized into `exoN` folders and most of what is required to
complete each is detailed in the comments. complete each is detailed in the comments.
## code style guide ## code style guide

View file

@ -8,10 +8,10 @@
// result of the first one to the second one. By applying this composition // result of the first one to the second one. By applying this composition
// over and over you can chain multiple functions together. // over and over you can chain multiple functions together.
// //
// The `fp-ts` library provides to helpers to do that: // The `fp-ts` library provides helpers to do that:
// - `pipe` which first needs to be fed a value to start the pipe and then // - `pipe` which first needs to be fed a value to start the pipe and then
// any number of functions to be applied sequentially. // any number of functions to be applied sequentially.
// - `flow` which is the same thing but were we do not have to provide the // - `flow` which is the same thing but where we do not have to provide the
// first value. It will then return a function which will expect that value // first value. It will then return a function which will expect that value
// to be provided // to be provided
// //
@ -55,11 +55,12 @@ export const isOddF: (value: number) => boolean = unimplemented;
// //
// Below is the functional equivalent of the control flow statement if-else. // Below is the functional equivalent of the control flow statement if-else.
export const ifThenElse = <A>(onTrue: () => A, onFalse: () => A) => ( export const ifThenElse =
condition: boolean, <A>(onTrue: () => A, onFalse: () => A) =>
) => (condition ? onTrue() : onFalse()); (condition: boolean) =>
condition ? onTrue() : onFalse();
// Using `pipe` the function that computes the next step in the Collatz // Using `pipe`, write the function that computes the next step in the Collatz
// sequence. // sequence.
export const next: (value: number) => number = unimplemented; export const next: (value: number) => number = unimplemented;

View file

@ -1,4 +1,4 @@
// `fp-ts` training Exercice 1 // `fp-ts` training Exercise 1
// Basic types: // Basic types:
// - Option // - Option
// - Either // - Either
@ -17,7 +17,7 @@ export const divide = (a: number, b: number): number => {
// OPTION // // OPTION //
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// Write the safe version of `divide` whith signature: // Write the safe version of `divide` with signature:
// safeDivide : (a: number, b: number) => Option<number> // safeDivide : (a: number, b: number) => Option<number>
// //
// HINT: Option has two basic contructors: // HINT: Option has two basic contructors:
@ -31,7 +31,7 @@ export const safeDivide: (a: number, b: number) => Option<number> =
// EITHER // // EITHER //
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// Write the safe version of `divide` whith signature: // Write the safe version of `divide` with signature:
// safeDivideWithError : (a: number, b: number) => Either<DivideByZeroError, number> // safeDivideWithError : (a: number, b: number) => Either<DivideByZeroError, number>
// //
// BONUS POINT: Implement `safeDivideWithError` in terms of `safeDivide`. // BONUS POINT: Implement `safeDivideWithError` in terms of `safeDivide`.
@ -67,7 +67,7 @@ export const asyncDivide = async (a: number, b: number) => {
return a / b; return a / b;
}; };
// Write the safe version of `divide` whith signature: // Write the safe version of `divide` with signature:
// asyncSafeDivideWithError : (a: number, b: number) => TaskEither<DivideByZeroError, number> // asyncSafeDivideWithError : (a: number, b: number) => TaskEither<DivideByZeroError, number>
// //
// HINT: TaskEither has a special constructor to transform a Promise<T> into // HINT: TaskEither has a special constructor to transform a Promise<T> into

View file

@ -1,4 +1,4 @@
// `fp-ts` training Exercice 2 // `fp-ts` training Exercise 2
// Let's have fun with combinators! // Let's have fun with combinators!
import { Either } from 'fp-ts/Either'; import { Either } from 'fp-ts/Either';
@ -133,7 +133,7 @@ export const checkTargetAndShoot: (
// OPTION // // OPTION //
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// The next three function take a `Character` and optionnaly return the // The next three function take a `Character` and optionally return the
// expected damage type if the unit match the expected character type. // expected damage type if the unit match the expected character type.
// //
// HINT: These functions represent the public API. But it is heavily // HINT: These functions represent the public API. But it is heavily

View file

@ -1,4 +1,4 @@
// `fp-ts` training Exercice 3 // `fp-ts` training Exercise 3
// Sort things out with `Ord` // Sort things out with `Ord`
import { Option } from 'fp-ts/Option'; import { Option } from 'fp-ts/Option';
@ -12,7 +12,7 @@ import { unimplemented } from '../utils';
// The difference with JavaScript's native `Array.prototype` methods is that // The difference with JavaScript's native `Array.prototype` methods is that
// these are more `fp-ts` friendly. // these are more `fp-ts` friendly.
// //
// In the following exercice, we will take a look at `array.sort`. Contrary to // In the following exercise, we will take a look at `array.sort`. Contrary to
// its JavaScript counterpart, `fp-ts` sort takes as an argument something of // its JavaScript counterpart, `fp-ts` sort takes as an argument something of
// type `Ord<T>` where `T` is the type of elements contained in the collection. // type `Ord<T>` where `T` is the type of elements contained in the collection.
// //

View file

@ -1,4 +1,4 @@
// `fp-ts` training Exercice 4 // `fp-ts` training Exercise 4
// Dependency injection with `Reader` // Dependency injection with `Reader`
import { Reader } from 'fp-ts/Reader'; import { Reader } from 'fp-ts/Reader';

View file

@ -1,4 +1,4 @@
// `fp-ts` training Exercice 5 // `fp-ts` training Exercise 5
// Managing nested effectful data with `traverse` // Managing nested effectful data with `traverse`
import { option, readonlyRecord, task } from 'fp-ts'; import { option, readonlyRecord, task } from 'fp-ts';
@ -224,5 +224,5 @@ export const sequenceOptionArray: (
arrayOfOptions: ReadonlyArray<Option<CountryCode>>, arrayOfOptions: ReadonlyArray<Option<CountryCode>>,
) => Option<ReadonlyArray<CountryCode>> = unimplemented; ) => Option<ReadonlyArray<CountryCode>> = unimplemented;
// BONUS: try using these two functions in the exercices 'TRAVERSING OPTIONS' // BONUS: try using these two functions in the exercises 'TRAVERSING OPTIONS'
// and 'TRAVERSING ARRAYS' above // and 'TRAVERSING ARRAYS' above