Repository: gcanti/fp-ts
Pull request #1470 (2021-04-05 11:28:03)

Do notation docs
Opening a draft PR to get some initial feedback on some documentation for the `Do` notation. The location and name of this file is not final, I wasn't sure where exactly we wanted this to live (in `guides` for example) so I just created it at the top level within `docs` for now with the idea that we can move it somewhere more appropriate once it's ready.

@pfgray feel free to add some more detailed examples at the end as you mentioned to me on Slack





Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 89fbae80..25e9ead1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -15,6 +15,618 @@
 **Note**: A feature tagged as Experimental is in a
 high state of flux, you're at risk of it changing without notice.
 
+# 2.10.4
+
+- **Bug Fix**
+  - `altW` left type is too wide in `Either`-based data types, #1488 (@wmaurer)
+
+# 2.10.3
+
+- **Bug Fix**
+  - `StateReaderTaskEither`
+    - `traverseArrayWithIndex` does not pass the output state from each step to the subsequent step, #1486
+
+# 2.10.2
+
+- **Bug Fix**
+  - `Record`
+    - `hasOwnProperty` should be an alias of `ReadonlyRecord.hasOwnProperty`
+
+# 2.10.1
+
+- **Bug Fix**
+  - rename `hasOwnProperty` in `internal` module, #1481 (@OliverJAsh)
+
+# 2.10.0
+
+- **Deprecations**
+  - deprecate `pipeable` module, use the specific helpers instead
+  - deprecate `ValidationT` module, use `EitherT` instead
+  - deprecate "mega instances", use small, specific instances instead
+  - deprecate the old monad transformers, use the specific helpers instead
+  - `Applicative`
+    - deprecate `getApplicativeComposition`, use `ap` helper instead
+  - `Array`
+    - deprecate `prependToAll`, use `prependAll` instead
+    - deprecate `cons` in favour of `prepend`
+    - deprecate `snoc` in favour of `append`
+    - deprecate `empty`
+  - `BooleanAlgebra`
+    - deprecate `booleanAlgebraBoolean`, use `boolean.BooleanAlgebra` instead
+    - deprecate `getFunctionBooleanAlgebra`, use `function.getBooleanAlgebra` instead
+    - deprecate `getDualBooleanAlgebra`, use `reverse` instead
+  - `Bounded`
+    - deprecate `boundedNumber`, use `number.Bounded` instead
+  - `Choice`
+    - deprecate `splitChoice` in favour of `split`
+    - deprecate `fanin` in favour of `fanIn`
+  - `Compactable`
+    - deprecate `getCompactableComposition`, use `compact`, `separate` helpers instead
+    - deprecate `Separated`, use `Separated.Separated` instead
+  - `Either`
+    - deprecate `getApplySemigroup` in favour of `Apply.getApplySemigroup`
+    - deprecate `getApplyMonoid` in favour of `Applicative.getApplicativeMonoid`
+    - deprecate `getValidationSemigroup` in favour of `Apply.getApplySemigroup`
+    - deprecate `getValidationMonoid` in favour of `Applicative.getApplicativeMonoid`
+    - deprecate `getValidation`, use `getApplicativeValidation` and `getAltValidation` instead
+    - deprecate `Json` type, use the `Json` module instead
+    - deprecate `parseJSON` type, use the `Json` module instead
+    - deprecate `stringifyJSON` type, use the `Json` module instead
+  - `Eq`
+    - deprecate `eqBoolean`, use `boolean.Eq` instead
+    - deprecate `eqString`, use `string.Eq` instead
+    - deprecate `eqNumber`, use `number.Eq` instead
+    - deprecate `eqDate`, use `Date.Eq` instead
+    - deprecate `getStructEq`, use `struct` instead
+    - deprecate `getTupleEq`, use `tuple` instead
+  - `Filterable`
+    - deprecate `getFilterableComposition`, use `filter`, `filterMap`, `partition`, `partitionMap` helpers instead
+  - `Foldable`
+    - deprecate `toArray` in favour of `toReadonlyArray`
+    - deprecate `getFoldableComposition`, use `reduce`, `foldMap`, `reduceRight` helpers instead
+  - `FoldableWithIndex`
+    - deprecate `getFoldableWithIndexComposition`, use `reduceWithIndex`, `foldMapWithIndex`, `reduceRightWithIndex` helpers instead
+  - `Functor`
+    - deprecate `getFunctorComposition`, use `map` helper instead
+  - `FunctorWithIndex`
+    - deprecate `getFunctorWithIndexComposition`, use `mapWithIndex` helper instead
+  - `IO`
+    - deprecate `getSemigroup` in favour of `Apply.getApplySemigroup`
+    - deprecate `getMonoid` in favour of `Applicative.getApplicativeMonoid`
+    - deprecate `fromIO`
+  - `IOEither`
+    - deprecate `getApplySemigroup` in favour of `Apply.getApplySemigroup`
+    - deprecate `getApplyMonoid` in favour of `Applicative.getApplicativeMonoid`
+    - deprecate `getSemigroup` in favour of `Apply.getApplySemigroup`
+    - deprecate `getIOValidation`, use `getApplicativeIOValidation` and `getAltIOValidation` instead
+  - `Map`
+    - deprecate `insertAt` in favour of `upsertAt`
+    - deprecate `empty`
+  - `Monoid`
+    - deprecate `monoidAll`, use `boolean.MonoidAll` instead
+    - deprecate `monoidAny`, use `boolean.MonoidAny` instead
+    - deprecate `getFunctionMonoid`, use `function.getMonoid` instead
+    - deprecate `getEndomorphismMonoid`, use `function.getEndomorphismMonoid` instead (**Note**. The execution order in
+      `function.getEndomorphismMonoid` is reversed)
+    - deprecate `monoidString`, use `string.Monoid` instead
+    - deprecate `monoidSum`, use `number.MonoidSum` instead
+    - deprecate `monoidProduct`, use `number.MonoidProduct` instead
+    - deprecate `fold`, use `concatAll` instead
+    - deprecate `getMeetMonoid`, use `min` instead
+    - deprecate `getJoinMonoid`, use `max` instead
+    - deprecate `getDualMonoid`, use `reverse` instead
+    - deprecate `getStructMonoid`, use `struct` instead
+    - deprecate `getTupleMonoid`, use `tuple` instead
+  - `NonEmptyArray`
+    - deprecate `fold`, use `concatAll` instead
+    - deprecate `prependToAll`, use `prependAll` instead
+    - deprecate `cons` in favour of `prepend`
+    - deprecate `snoc` in favour of `append`
+    - deprecate `uncons` in favour of `unprepend`
+    - deprecate `unsnoc` in favour of `unappend`
+    - deprecate `filter` in favour of `Array`'s `filter`
+    - deprecate `filterWithIndex` in favour of `Array`'s `filterWithIndex`
+  - `Option`
+    - deprecate `getApplySemigroup` in favour of `Apply.getApplySemigroup`
+    - deprecate `getApplyMonoid` in favour of `Applicative.getApplicativeMonoid`
+  - `Ord`
+    - deprecate `ordBoolean`, use `boolean.Ord` instead
+    - deprecate `ordString`, use `string.Ord` instead
+    - deprecate `ordNumber`, use `number.Ord` instead
+    - deprecate `ordDate`, use `Date.Ord` instead
+    - deprecate `getDualOrd`, use `reverse` instead
+    - deprecate `getTupleOrd`, use `tuple` instead
+  - `Ordering`
+    - deprecate `eqOrdering`, use `Eq` instead
+    - deprecate `monoidOrdering`, use `Monoid` instead
+    - deprecate `invert` in favour of `reverse`
+  - `Ring`
+    - deprecate `getFunctionRing`, use `function.getRing` instead
+  - `Reader`
+    - deprecate `getSemigroup` in favour of `Apply.getApplySemigroup`
+    - deprecate `getMonoid` in favour of `Applicative.getApplicativeMonoid`
+  - `ReaderEither`
+    - deprecate `getApplySemigroup` in favour of `Apply.getApplySemigroup`
+    - deprecate `getApplyMonoid` in favour of `Applicative.getApplicativeMonoid`
+    - deprecate `getSemigroup` in favour of `Apply.getApplySemigroup`
+    - deprecate `getReaderValidation`, use `getApplicativeReaderValidation` and `getAltReaderValidation` instead
+    - deprecate `local`, Use `Reader`'s `local` instead
+  - `ReaderTask`
+    - deprecate `getSemigroup` in favour of `Apply.getApplySemigroup`
+    - deprecate `getMonoid` in favour of `Applicative.getApplicativeMonoid`
+    - deprecate `run`
+    - deprecate `local`, Use `Reader`'s `local` instead
+  - `ReaderTaskEither`
+    - deprecate `getApplySemigroup` in favour of `Apply.getApplySemigroup`
+    - deprecate `getApplyMonoid` in favour of `Applicative.getApplicativeMonoid`
+    - deprecate `getSemigroup` in favour of `Apply.getApplySemigroup`
+    - deprecate `getReaderTaskValidation`, use `getApplicativeReaderTaskValidation` and `getAltReaderTaskValidation` instead
+    - deprecate `run`
+    - deprecate `local`, Use `Reader`'s `local` instead
+  - `ReaderTaskEither`
+    - deprecate `run`
+  - `ReadonlyArray`
+    - deprecate `prependToAll`, use `prependAll` instead
+    - deprecate `cons` in favour of `prepend`
+    - deprecate `snoc` in favour of `append`
+  - `ReadonlyNonEmptyArray`
+    - deprecate `fold`, use `concatAll` instead
+    - deprecate `prependToAll`, use `prependAll` instead
+    - deprecate `insertAt`, Use `ReadonlyArray`'s `insertAt` instead
+    - deprecate `cons` in favour of `prepend`
+    - deprecate `snoc` in favour of `append`
+    - deprecate `uncons` in favour of `unprepend`
+    - deprecate `unsnoc` in favour of `unappend`
+    - deprecate `filter` in favour of `ReadonlyArray`'s `filter`
+    - deprecate `filterWithIndex` in favour of `ReadonlyArray`'s `filterWithIndex`
+  - `ReadonlyMap`
+    - deprecate `insertAt` in favour of `upsertAt`
+  - `ReadonlyRecord`
+    - deprecate `hasOwnProperty`, use `has` instead
+    - deprecate `insertAt` in favour of `upsertAt`
+  - `ReadonlySet`
+    - deprecate `fromArray` in favour of `fromReadonlyArray`
+  - `ReadonlyTuple`
+    - deprecate `mapLeft` in favour of `mapSnd`
+    - deprecate `map` in favour of `mapFst`
+  - `Record`
+    - deprecate `hasOwnProperty`, use `has` instead
+    - deprecate `insertAt` in favour of `upsertAt`
+    - deprecate `empty`
+  - `Ring`
+    - deprecate `getTupleRing`, use `tuple` instead
+  - `Semigroup`
+    - deprecate `semigroupAll`, use `boolean.SemigroupAll` instead
+    - deprecate `semigroupAny`, use `boolean.SemigroupAny` instead
+    - deprecate `getFunctionSemigroup`, use `function.getSemigroup` instead
+    - deprecate `semigroupString`, use `string.Semigroup` instead
+    - deprecate `semigroupSum`, use `number.SemigroupSum` instead
+    - deprecate `semigroupProduct`, use `number.SemigroupProduct` instead
+    - deprecate `fold`, use `concatAll` instead
+    - deprecate `getIntercalateSemigroup`, use `intercalate` instead
+    - deprecate `getMeetSemigroup`, use `min` instead
+    - deprecate `getJoinSemigroup`, use `max` instead
+    - deprecate `getDualSemigroup`, use `reverse` instead
+    - deprecate `getStructSemigroup`, use `struct` instead
+    - deprecate `getTupleSemigroup`, use `tuple` instead
+    - deprecate `getFirstSemigroup`, use `first` instead
+    - deprecate `getLastSemigroup`, use `last` instead
+    - deprecate `getObjectSemigroup`, use `assign` instead
+  - `Set`
+    - deprecate `subset` in favour of `isSubset`
+  - `Show`
+    - deprecate `showBoolean`, use `boolean.Show` instead
+    - deprecate `showString`, use `string.Show` instead
+    - deprecate `showNumber`, use `number.Show` instead
+    - deprecate `getStructShow`, use `struct` instead
+    - deprecate `getTupleShow`, use `tuple` instead
+  - `Strong`
+    - deprecate `splitStrong` in favour of `split`
+    - deprecate `fanout` in favour of `fanOut`
+  - `Task`
+    - deprecate `getSemigroup` in favour of `Apply.getApplySemigroup`
+    - deprecate `getMonoid` in favour of `Applicative.getApplicativeMonoid`
+    - deprecate `fromTask`
+  - `TaskEither`
+    - deprecate `getApplySemigroup` in favour of `Apply.getApplySemigroup`
+    - deprecate `getApplyMonoid` in favour of `Applicative.getApplicativeMonoid`
+    - deprecate `getSemigroup` in favour of `Apply.getApplySemigroup`
+    - deprecate `getTaskValidation`, use `getApplicativeTaskValidation` and `getAltTaskValidation` instead
+  - `TaskThese`
+    - deprecate `functorTaskThese` instance in favour of `Functor`
+    - deprecate `bifunctorTaskThese` instance in favour of `Bifunctor`
+    - deprecate `getSemigroup` in favour of `Apply.getApplySemigroup`
+    - deprecate `toTuple` in favour of `toTuple2`
+  - `These`
+    - deprecate `toTuple` in favour of `toTuple2`
+  - `Traversable`
+    - deprecate `getTraversableComposition`, use `traverse`, `sequence` helpers instead
+  - `Tuple`
+    - deprecate `mapLeft` in favour of `mapSnd`
+    - deprecate `map` in favour of `mapFst`
+- **New Feature**
+  - add `Pointed` type class
+  - add `FromEither` type class
+  - add `FromIO` type class
+  - add `FromTask` type class
+  - add `TaskOption` module
+  - add `string` module
+  - add `number` module
+  - add `Separated` module (@YBogomolov)
+  - add `Json` module
+  - `Apply`
+    - add `ap` helper
+    - add `apS` helper
+    - add `apFirst` helper
+    - add `apSecond` helper
+    - add `getApplySemigroup`
+  - `Applicative`
+    - add `getApplicativeMonoid`
+  - `Array`
+    - add `Pointed` instance
+    - add `Apply` instance
+    - add `matchLeft` alias
+    - add `matchRight` alias
+    - add `size`
+    - better `unsafeInsertAt` signature
+    - better `chunksOf` signature
+    - add `getSemigroup`
+  - `boolean`
+    - add `foldW`
+    - add `match` alias
+    - add `matchW` alias
+    - add `Eq` instance
+    - add `BooleanAlgebra` instance
+    - add `SemigroupAll` instance
+    - add `SemigroupAny` instance
+    - add `MonoidAll` instance
+    - add `MonoidAny` instance
+    - add `Ord` instance
+    - add `Show` instance
+  - `BooleanAlgebra`
+    - add `reverse`
+  - `Chain`
+    - add `bind` helper
+    - add `chainFirst` helper
+  - `Compactable`
+    - add `compact` helper
+    - add `separate` helper
+    - add `separated` constructor
+  - `Date`
+    - add `Eq` instance
+    - add `Ord` instance
+  - `Filterable`
+    - add `filter` helper
+    - add `filterMap` helper
+    - add `partition` helper
+    - add `partitionMap` helper
+  - `Foldable`
+    - add `reduce` helper
+    - add `foldaMap` helper
+    - add `reduceRight` helper
+  - `FoldableWithIndex`
+    - add `reduceWithIndex` helper
+    - add `foldaMapWithIndex` helper
+    - add `reduceRightWithIndex` helper
+  - `function`
+    - add `getBooleanAlgebra`
+    - add `getSemigroup`
+    - add `getMonoid`
+    - add `getSemiring`
+    - add `getRing`
+    - add `getEndomorphismMonoid`
+  - `Functor`
+    - add `map` helper
+    - add `bindTo` helper
+    - add `flap` derivable, #1393 (@williamareynolds)
+  - `FunctorWithIndex`
+    - add `mapWithIndex` helper
+  - `Either`
+    - add `Pointed` instance
+    - add `Apply` instance
+    - add `getCompactable`
+    - add `getFilterable`
+    - add `FromEither` instance
+    - add `toUnion`, closes #1362
+    - add `foldW`
+    - add `match` alias
+    - add `matchW` alias
+    - add `orElseW`
+    - add `tryCatchK`
+    - add `fromOptionK`
+    - add `chainOptionK`
+  - `EitherT`
+    - split `getEitherM` into separated functions
+  - `Eq`
+    - add `getSemigroup`
+    - add `struct`
+    - add `tuple`
+  - `Identity`
+    - add `Pointed` instance
+    - add `Apply` instance
+  - `IO`
+    - add `Pointed` instance
+    - add `Apply` instance
+    - add `FromIO` instance
+  - `IOEither`
+    - add `Pointed` instance
+    - add `getCompactable`
+    - add `FromIO` instance
+    - add `FromEither` instance
+    - add `tryCatchK` combinator
+    - add `toUnion`
+    - add `foldW`
+    - add `match` alias
+    - add `matchW` alias
+    - add `orElseW`
+    - add `fromOptionK`
+    - add `chainOptionK`
+  - `Map`
+    - add `filterWithIndex` combinator
+    - add `filterMapWithIndex` combinator
+    - add `partitionWithIndex` combinator
+    - add `partitionMapWithIndex` combinator
+    - add `getTraversableWithIndex` instance
+    - add `getFoldableWithIndex` instance
+  - `Monoid`
+    - add `concatAll`
+    - add `min`
+    - add `max`
+    - add `reverse`
+    - add `struct`
+    - add `tuple`
+  - `NonEmptyArray`
+    - add `Pointed` instance
+    - add `Apply` instance
+    - add `concatAll`
+    - add `isNonEmpty` guard
+    - add `fromReadonlyNonEmptyArray` constructor
+    - add `chainWithIndex` combinator
+    - add `chop`
+    - add `splitAt`
+    - add `chunksOf`
+  - `Option`
+    - add `Pointed` instance
+    - add `Apply` instance
+    - add `foldW`
+    - add `match` alias
+    - add `matchW` alias
+    - add `tryCatchK`
+  - `OptionT`
+    - split `getOptionM` into separated functions
+  - `Ord`
+    - add `equalsDefault`
+    - add `reverse`
+    - add `tuple`
+  - `Ordering`
+    - add `Eq` instance
+    - add `Semigroup` instance
+    - add `Monoid` instance
+    - add `match`
+  - `Random`
+    - add `randomElem`
+  - `Reader`
+    - add `Pointed` instance
+    - add `Apply` instance
+    - export `first`, `second`, `left`, `right`
+  - `ReaderT`
+    - split `getReaderM` into separated functions
+  - `ReaderEither`
+    - add `Pointed` instance
+    - add `Apply` instance
+    - add `FromEither` instance
+    - add `getCompactable`
+    - add `getFilterable`
+    - add `toUnion`
+    - add `foldW`
+    - add `match` alias
+    - add `matchW` alias
+    - add `orElseW`
+    - add `fromOptionK`
+    - add `chainOptionK`
+  - `ReaderTask`
+    - add `Pointed` instance
+    - add `ApplyPar` instance
+    - add `ApplySeq` instance
+    - add `FromIO` instance
+    - add `FromTask` instance
+    - add `traverseSeqArrayWithIndex`
+    - add `traverseSeqArray`
+    - add `sequenceSeqArray`
+    - export `Chain` instance
+    - export `Monad` instance
+    - export `MonadIO` instance
+    - export `MonadTask` instance
+  - `ReaderTaskEither`
+    - add `Pointed` instance
+    - add `ApplyPar` instance
+    - add `ApplySeq` instance
+    - add `FromIO` instance
+    - add `FromTask` instance
+    - add `FromEither` instance
+    - add `getCompactable`
+    - add `getFilterable`
+    - add `toUnion`
+    - add `foldW`
+    - add `match` alias
+    - add `matchW` alias
+    - add `orElseW`
+    - add `fromOptionK`
+    - add `chainOptionK`
+    - export `Chain` instance
+    - export `Monad` instance
+    - export `MonadIO` instance
+    - export `MonadTask` instance
+    - export `MonadThrow` instance
+  - `ReadonlyArray`
+    - add `Pointed` instance
+    - add `Apply` instance
+    - add `getSemigroup`
+    - add `matchLeft` instance
+    - add `matchRight` instance
+    - add `size`
+    - better `unsafeInsertAt` signature
+    - better `chunksOf` signature, closes #1407
+  - `ReadonlyMap`
+    - add `filterWithIndex` combinator
+    - add `filterMapWithIndex` combinator
+    - add `partitionWithIndex` combinator
+    - add `partitionMapWithIndex` combinator
+    - add `getFunctorWithIndex`
+    - add `getFoldable`
+    - add `getFoldableWithIndex`
+    - add `getTraversable`
+    - add `getTraversableWithIndex`
+  - `ReadonlyNonEmptyArray`
+    - add `Pointed` instance
+    - add `Apply` instance
+    - add `concatAll`
+    - add `isNonEmpty`
+    - add `chainWithIndex`
+    - add `chop`
+    - add `splitAt`
+    - add `chunksOf`
+  - `ReadonlySet`
+    - add `isEmpty`
+    - add `size`
+    - add `toggle`
+  - `Ring`
+    - add `tuple`
+  - `Set`
+    - add `isEmpty`
+    - add `size`
+  - `Semigroup`
+    - add `constant`
+    - add `concatAll`
+    - add `intercalate`
+    - add `min`
+    - add `max`
+    - add `struct`
+    - add `tuple`
+    - add `first`
+    - add `last`
+    - add `assign`
+  - `Show`
+    - add `struct`
+    - add `tuple`
+  - `State`
+    - add `Pointed` instance
+    - add `Apply` instance
+  - `StateT`
+    - split `getStateM` into separated functions
+  - `StateReaderTaskEither`
+    - add `Pointed` instance
+    - add `Apply` instance
+    - add `Monad` instance
+    - add `FromIO` instance
+    - add `FromTask` instance
+    - add `FromEither` instance
+    - add `fromOptionK`
+    - add `chainOptionK`
+    - export `MonadIO` instance
+    - export `MonadTask` instance
+    - export `MonadThrow` instance
+  - `Task`
+    - add `Pointed` instance
+    - add `ApplyPar` instance
+    - add `ApplySeq` instance
+    - add `FromIO` instance
+    - add `FromTask` instance
+    - export `Chain` instance
+    - export `Monad` instance
+    - export `MonadIO` instance
+    - export `MonadTask` instance
+  - `TaskEither`
+    - add `Pointed` instance
+    - add `ApplyPar` instance
+    - add `ApplySeq` instance
+    - add `getCompactable`
+    - add `FromIO` instance
+    - add `FromTask` instance
+    - add `FromEither` instance
+    - add `toUnion`
+    - add `foldW`
+    - add `match` alias
+    - add `matchW` alias
+    - add `orElseW`
+    - add `fromOptionK`
+    - add `chainOptionK`
+    - export `Chain` instance
+    - export `Monad` instance
+    - export `MonadIO` instance
+    - export `MonadTask` instance
+    - export `MonadThrow` instance
+  - `TaskThese`
+    - add `Functor` instance
+    - add `Pointed` instance
+    - add `Bifunctor` instance
+    - add `toTuple2`
+    - add `getApply`
+    - add `FromIO` instance
+    - add `FromTask` instance
+    - add `fromEither` function
+    - add `FromEither` instance
+    - add `getChain` instance
+    - add `foldW`
+    - add `match` alias
+    - add `matchW` alias
+    - add `fromOption`
+    - add `fromOptionK`
+    - add `fromPredicate`
+  - `These`
+    - add `Pointed` instance
+    - add `of` function
+    - add `getApply`
+    - add `toTuple2`
+    - add `FromEither` instance
+    - add `fromOption` constructor
+    - add `foldW`
+    - add `match` alias
+    - add `matchW` alias
+    - add `fromOptionK`
+  - `TaskOption`
+    - export `Chain` instance
+    - export `Monad` instance
+  - `TheseT`
+    - split `getTheseM` into separated functions
+  - `Traversable`
+    - add `traverse` helper
+    - add `sequence` helper
+  - `Tree`
+    - add `Pointed` instance
+    - add `Apply` instance
+  - `Writer`
+    - add `getPointed`
+    - add `getApply`
+    - add `getApplicative`
+    - add `getChain`
+- **Bug Fix**
+  - `ReadonlyRecord` / `Record`: remove `extends string` constraints in `singleton` / `insertAt`, closes #1413
+  - `TaskOption`
+    - fix `getOrElseW` signature
+- **Internal**
+  - add `internal` module
+- **Polish**
+  - the scope in `bindTo`, `bind`, `bindW`, `apS`, `apSW` is now correctly `readonly`
+  - fix `FromEither` type parameter order
+  - `Array` / `ReadonlyArray`
+    - assert arrays as non-empty when using `some`, #1424 (@thewilkybarkid)
+    - fix `matchLeft`, `matchRight` type parameter order
+  - `EitherT`
+    - add overloads for `Kind2`, `Kind3`, `Kind4`
+  - `OptionT`
+    - add overloads for `Kind2`, `Kind3`, `Kind4`
+  - `ReaderT`
+    - add overloads for `Kind2`, `Kind3`, `Kind4`
+  - `ReadonlyMap`
+    - sort keys in `getShow`
+  - `ReadonlySet`
+    - sort keys in `getShow`
+  - `StateT`
+    - add overloads for `Kind2`, `Kind3`
+  - `TheseT`
+    - add overloads for `Kind2`, `Kind3`, `Kind4`
+
 # 2.10.0-rc.8
 
 - **Polish**
diff --git a/README.md b/README.md
index b3723d17..e8e4b42c 100644
--- a/README.md
+++ b/README.md
@@ -34,21 +34,6 @@ A distinctive feature of `fp-ts` with respect to other functional libraries is i
 - [PureScript](http://www.purescript.org)
 - [Scala](https://www.scala-lang.org/)
 
-<!-- START doctoc generated TOC please keep comment here to allow auto update -->
-<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
-
-**Table of contents**
-
-- [Installation](#installation)
-  - [Consuming fp-ts](#consuming-fp-ts)
-  - [TypeScript compatibility](#typescript-compatibility)
-- [Documentation](#documentation)
-- [Help](#help)
-- [Development](#development)
-- [License](#license)
-
-<!-- END doctoc generated TOC please keep comment here to allow auto update -->
-
 # Installation
 
 To install the stable version:
diff --git a/docs/guides/do-notation.md b/docs/guides/do-notation.md
new file mode 100644
index 00000000..38c1dc49
--- /dev/null
+++ b/docs/guides/do-notation.md
@@ -0,0 +1,121 @@
+---
+title: Do notation
+parent: Guides
+nav_order: 4
+---
+
+# Do Notation
+
+Both [Haskell](https://wiki.haskell.org/Monad#do-notation)
+and [PureScript](https://github.com/purescript/documentation/blob/master/language/Syntax.md#do-notation)
+languages provide syntactic sugar for working with monads in the form of do notation.
+
+`fp-ts` provides it's own implementation of do notation which can help to simplify effectful
+code.
+
+Let's take a look at an example of how do notation can help to simplify our code. Here we have
+a bit of code which reads two values from the command line, prints them and stores them
+in an object with `x` and `y` properties.
+
+```ts
+import { pipe } from 'fp-ts/function'
+import * as T from 'fp-ts/Task'
+
+declare const print: (s: string) => T.Task<void>
+declare const readLine: T.Task<string>
+
+const main: T.Task<{ x: string, y: string }> = pipe(
+  readLine,
+  T.map(x => ({ x })),
+  T.chain(({ x }) => pipe(readLine, T.map(y => ({ x, y })))),
+  T.chainFirst(({ x }) => print(x)),
+  T.chainFirst(({ y }) => print(y)),
+)
+```
+
+Notice how we need a nested `pipe` to allow the combination of `x` and `y` values into a single
+object.
+
+Here's how we can write `main` with do notation (we'll call it `mainDo`):
+```ts
+const mainDo: T.Task<{ x: string, y: string }> = pipe(
+  T.Do,
+  T.bind('x', () => readLine),
+  T.bind('y', () => readLine),
+  T.chainFirst(({ x }) => print(x)),
+  T.chainFirst(({ y }) => print(y)),
+)
+```
+
+This will look very familiar to those who have prior experience with Purescript or Haskell
+where we could write something like:
+
+```haskell
+main :: IO (String, String)
+main = do
+  x <- readLn
+  y <- readLn
+  print x
+  print y
+  return (x, y)
+```
+
+Note that due to the lack of type-classes in Typescript, when working with `fp-ts` we need to
+import everything from the appropriate module. In the previous example, we use specific `Do`,
+`bind`, `map` and `chainFirst` functions imported from the `Task` module as we were working
+with the `Task` type.
+
+If we were to write the same code using the `IO` monad, we would need to import everything from the `IO`
+module like so:
+
+```ts
+import { pipe } from 'fp-ts/function'
+import * as IO from 'fp-ts/IO'
+
+declare const print: (s: string) => IO.IO<void>
+declare const readLine: IO.IO<string>
+
+const mainDo: IO.IO<{ x: string, y: string }> = pipe(
+  IO.Do,
+  IO.bind('x', () => readLine),
+  IO.bind('y', () => readLine),
+  IO.chainFirst(({ x }) => print(x)),
+  IO.chainFirst(({ y }) => print(y)),
+)
+```
+
+## Examples
+
+Using `bindTo`:
+
+```ts
+import { pipe } from 'fp-ts/function'
+import * as T from 'fp-ts/Task'
+
+declare const print: (s: string) => T.Task<void>
+declare const readLine: T.Task<string>
+
+pipe(
+  readLine,
+  T.bindTo('x'),
+  T.bind('y', () => readLine),
+  T.chainFirst(({ x }) => print(x)),
+  T.chainFirst(({ y }) => print(y)),
+)
+```
+
+Performing actions in parallel with `apS`:
+
+```ts
+import { pipe } from 'fp-ts/function'
+import * as T from 'fp-ts/Task'
+
+declare const encryptValue: (val: string) => T.Task<string>
+
+pipe(
+  T.Do,
+  T.apS('x', encryptValue("hello")),
+  T.apS('y', encryptValue("world")),
+  T.map(({ x, y }) => { /* ... */ })
+)
+```
diff --git a/docs/guides/upgrade-to-v2.md b/docs/guides/upgrade-to-v2.md
index 7c0cda86..eba07d9f 100644
--- a/docs/guides/upgrade-to-v2.md
+++ b/docs/guides/upgrade-to-v2.md
@@ -1,7 +1,7 @@
 ---
 title: Upgrade to fp-ts 2.x
 parent: Guides
-nav_order: 4
+nav_order: 5
 ---
 
 # Upgrade to version 2.x
diff --git a/docs/modules/Applicative.ts.md b/docs/modules/Applicative.ts.md
index 88ca6248..c362bc63 100644
--- a/docs/modules/Applicative.ts.md
+++ b/docs/modules/Applicative.ts.md
@@ -314,7 +314,7 @@ Added in v2.0.0
 
 ## ~~getApplicativeComposition~~
 
-Like `Functor`, `Applicative`s compose. If `F` and `G` have `Applicative` instances, then so does `F<G<_>>`
+Use [`ap`](./Apply.ts.html#ap) instead.
 
 **Signature**
 
diff --git a/docs/modules/Array.ts.md b/docs/modules/Array.ts.md
index d9c17b45..fd723f6b 100644
--- a/docs/modules/Array.ts.md
+++ b/docs/modules/Array.ts.md
@@ -1578,7 +1578,7 @@ Added in v2.0.0
 
 ## foldLeft
 
-Alias of [`matchLeft`](#matchLeft).
+Alias of [`matchLeft`](#matchleft).
 
 **Signature**
 
@@ -1590,7 +1590,7 @@ Added in v2.0.0
 
 ## foldRight
 
-Alias of [`matchRight`](#matchRight).
+Alias of [`matchRight`](#matchright).
 
 **Signature**
 
diff --git a/docs/modules/BooleanAlgebra.ts.md b/docs/modules/BooleanAlgebra.ts.md
index c408f9a0..7517ab48 100644
--- a/docs/modules/BooleanAlgebra.ts.md
+++ b/docs/modules/BooleanAlgebra.ts.md
@@ -49,7 +49,7 @@ Added in v2.10.0
 
 ## ~~getDualBooleanAlgebra~~
 
-Use `reverse` instead.
+Use [`reverse`](#reverse) instead.
 
 **Signature**
 
@@ -73,7 +73,7 @@ Added in v2.0.0
 
 ## ~~booleanAlgebraBoolean~~
 
-Use `boolean.BooleanAlgebra` instead.
+Use [`BooleanAlgebra`](./boolean.ts.html#BooleanAlgebra) instead.
 
 **Signature**
 
@@ -85,7 +85,7 @@ Added in v2.0.0
 
 ## ~~getFunctionBooleanAlgebra~~
 
-Use `function.getBooleanAlgebra` instead
+Use [`getBooleanAlgebra`](./function.ts.html#getBooleanAlgebra) instead.
 
 **Signature**
 
diff --git a/docs/modules/Bounded.ts.md b/docs/modules/Bounded.ts.md
index 9ea35232..56b6758b 100644
--- a/docs/modules/Bounded.ts.md
+++ b/docs/modules/Bounded.ts.md
@@ -29,7 +29,7 @@ Added in v2.0.0
 
 ## ~~boundedNumber~~
 
-Use `number.Bounded` instead.
+Use [`Bounded`](./number.ts.html#Bounded) instead.
 
 **Signature**
 
diff --git a/docs/modules/Choice.ts.md b/docs/modules/Choice.ts.md
index a46596df..85ef2806 100644
--- a/docs/modules/Choice.ts.md
+++ b/docs/modules/Choice.ts.md
@@ -195,7 +195,7 @@ Added in v2.10.0
 
 ## ~~fanin~~
 
-Use `fanIn` instead.
+Use [`fanIn`](#fanIn) instead.
 
 **Signature**
 
@@ -215,7 +215,7 @@ Added in v2.0.0
 
 ## ~~splitChoice~~
 
-Use `split` instead.
+Use [`split`](#split) instead.
 
 **Signature**
 
diff --git a/docs/modules/Compactable.ts.md b/docs/modules/Compactable.ts.md
index fc83cffb..abcd4b57 100644
--- a/docs/modules/Compactable.ts.md
+++ b/docs/modules/Compactable.ts.md
@@ -369,7 +369,7 @@ Added in v2.0.0
 
 ## ~~Separated~~ (interface)
 
-Use `Separated.Separated` instead.
+Use [`Separated`](./Separated.ts.html#Separated) instead.
 
 **Signature**
 
@@ -384,6 +384,8 @@ Added in v2.0.0
 
 ## ~~getCompactableComposition~~
 
+Use [`compact`](#compact) and [`separate`](#separate) instead.
+
 **Signature**
 
 ```ts
diff --git a/docs/modules/Either.ts.md b/docs/modules/Either.ts.md
index 2c2ff1d1..574ed74a 100644
--- a/docs/modules/Either.ts.md
+++ b/docs/modules/Either.ts.md
@@ -166,7 +166,7 @@ Less strict version of [`alt`](#alt).
 **Signature**
 
 ```ts
-export declare const altW: <E2, B>(that: Lazy<Either<E2, B>>) => <E1, A>(fa: Either<E1, A>) => Either<E2 | E1, B | A>
+export declare const altW: <E2, B>(that: Lazy<Either<E2, B>>) => <E1, A>(fa: Either<E1, A>) => Either<E2, B | A>
 ```
 
 Added in v2.9.0
@@ -478,7 +478,7 @@ Added in v2.0.0
 
 ## chainFirstW
 
-Less strict version of [`chainFirst`](#chainFirst)
+Less strict version of [`chainFirst`](#chainfirst)
 
 Derivable from `Chain`.
 
@@ -569,7 +569,7 @@ Added in v2.0.0
 
 ## filterOrElseW
 
-Less strict version of [`filterOrElse`](#filterOrElse).
+Less strict version of [`filterOrElse`](#filterorelse).
 
 **Signature**
 
@@ -646,7 +646,7 @@ Added in v2.0.0
 
 ## orElseW
 
-Less strict version of [`orElse`](#orElse).
+Less strict version of [`orElse`](#orelse).
 
 **Signature**
 
@@ -774,7 +774,7 @@ Added in v2.0.0
 
 ## ~~parseJSON~~
 
-Use the `Json.parse` module instead.
+Use [`parse`](./Json.ts.html#parse) instead.
 
 **Signature**
 
@@ -786,7 +786,7 @@ Added in v2.0.0
 
 ## ~~stringifyJSON~~
 
-Use the `Json.stringify` module instead.
+Use [`stringify`](./Json.ts.html#stringify) instead.
 
 **Signature**
 
@@ -812,7 +812,7 @@ Added in v2.0.0
 
 ## foldW
 
-Alias of [`matchW`](#matchW).
+Alias of [`matchW`](#matchww).
 
 **Signature**
 
@@ -858,7 +858,7 @@ Added in v2.0.0
 
 ## getOrElseW
 
-Less strict version of [`getOrElse`](#getOrElse).
+Less strict version of [`getOrElse`](#getorelse).
 
 **Signature**
 
@@ -1222,7 +1222,7 @@ Added in v2.0.0
 
 ## ~~getApplyMonoid~~
 
-Use `Applicative.getApplicativeMonoid` instead.
+Use [`getApplicativeMonoid`](./Applicative.ts.html#getApplicativeMonoid) instead.
 
 **Signature**
 
@@ -1234,7 +1234,7 @@ Added in v2.0.0
 
 ## ~~getApplySemigroup~~
 
-Use `Apply.getApplySemigroup` instead.
+Use [`getApplySemigroup`](./Apply.ts.html#getApplySemigroup) instead.
 
 Semigroup returning the left-most `Left` value. If both operands are `Right`s then the inner values
 are concatenated using the provided `Semigroup`
@@ -1249,7 +1249,7 @@ Added in v2.0.0
 
 ## ~~getValidationMonoid~~
 
-Use `Applicative.getApplicativeMonoid` instead.
+Use [`getApplicativeMonoid`](./Applicative.ts.html#getApplicativeMonoid) instead.
 
 **Signature**
 
@@ -1261,7 +1261,7 @@ Added in v2.0.0
 
 ## ~~getValidationSemigroup~~
 
-Use `Apply.getApplySemigroup` instead.
+Use [`getApplySemigroup`](./Apply.ts.html#getApplySemigroup) instead.
 
 **Signature**
 
@@ -1273,7 +1273,7 @@ Added in v2.0.0
 
 ## ~~getValidation~~
 
-Use `getApplicativeValidation` and `getAltValidation` instead.
+Use [`getApplicativeValidation`](#getapplicativevalidation) and [`getAltValidation`](#getaltvalidation) instead.
 
 **Signature**
 
@@ -1356,7 +1356,7 @@ Added in v2.10.0
 
 Constructs a new `Either` from a function that might throw.
 
-See also [`tryCatchK`](#tryCatchK).
+See also [`tryCatchK`](#trycatchk).
 
 **Signature**
 
@@ -1604,7 +1604,7 @@ Added in v2.9.0
 
 ## ~~JsonArray~~ (interface)
 
-Use the `Json` module instead.
+Use [`Json`](./Json.ts.html) module instead.
 
 **Signature**
 
@@ -1616,7 +1616,7 @@ Added in v2.6.7
 
 ## ~~JsonRecord~~ (interface)
 
-Use the `Json` module instead.
+Use [`Json`](./Json.ts.html) module instead.
 
 **Signature**
 
@@ -1631,7 +1631,7 @@ Added in v2.6.7
 
 ## ~~Json~~ (type alias)
 
-Use the `Json` module instead.
+Use [`Json`](./Json.ts.html) module instead.
 
 **Signature**
 
diff --git a/docs/modules/Eq.ts.md b/docs/modules/Eq.ts.md
index 8270840a..a7c7042c 100644
--- a/docs/modules/Eq.ts.md
+++ b/docs/modules/Eq.ts.md
@@ -101,7 +101,7 @@ Added in v2.10.0
 
 ## ~~getStructEq~~
 
-Use `struct` instead.
+Use [`struct`](#struct) instead.
 
 **Signature**
 
@@ -113,7 +113,7 @@ Added in v2.0.0
 
 ## ~~getTupleEq~~
 
-Use `tuple` instead.
+Use [`tuple`](#tuple) instead.
 
 **Signature**
 
@@ -201,7 +201,7 @@ Added in v2.10.0
 
 ## ~~eqBoolean~~
 
-Use `boolean.Eq` instead.
+Use [`Eq`](./boolean.ts.html#Eq) instead.
 
 **Signature**
 
@@ -213,7 +213,7 @@ Added in v2.0.0
 
 ## ~~eqDate~~
 
-Use `Date.Eq` instead.
+Use [`Eq`](./Date.ts.html#Eq) instead.
 
 **Signature**
 
@@ -225,7 +225,7 @@ Added in v2.0.0
 
 ## ~~eqNumber~~
 
-Use `number.Eq` instead.
+Use [`Eq`](./number.ts.html#Eq) instead.
 
 **Signature**
 
@@ -237,7 +237,7 @@ Added in v2.0.0
 
 ## ~~eqString~~
 
-Use `string.Eq` instead.
+Use [`Eq`](./string.ts.html#Eq) instead.
 
 **Signature**
 
@@ -277,7 +277,7 @@ Added in v2.0.0
 
 ## ~~strictEqual~~
 
-Use `eqStrict` instead
+Use [`eqStrict`](#eqstrict) instead
 
 **Signature**
 
diff --git a/docs/modules/Field.ts.md b/docs/modules/Field.ts.md
index 81ed9b16..f2d0971a 100644
--- a/docs/modules/Field.ts.md
+++ b/docs/modules/Field.ts.md
@@ -28,6 +28,8 @@ Added in v2.0.0
 
 ## ~~fieldNumber~~
 
+Use [`Field`](./number.ts.html#Field) instead.
+
 **Signature**
 
 ```ts
diff --git a/docs/modules/Filterable.ts.md b/docs/modules/Filterable.ts.md
index 06c2f993..64976533 100644
--- a/docs/modules/Filterable.ts.md
+++ b/docs/modules/Filterable.ts.md
@@ -726,6 +726,15 @@ Added in v2.0.0
 
 ## ~~getFilterableComposition~~
 
+Use
+
+- [`filter`](#filter)
+- [`filterMap`](#filtermap)
+- [`partition`](#partition)
+- [`partitionMap`](#partitionmap)
+
+instead.
+
 **Signature**
 
 ```ts
diff --git a/docs/modules/Foldable.ts.md b/docs/modules/Foldable.ts.md
index e4c3bda9..b5427ed7 100644
--- a/docs/modules/Foldable.ts.md
+++ b/docs/modules/Foldable.ts.md
@@ -501,7 +501,7 @@ Added in v2.0.0
 
 ## ~~foldM~~
 
-Use `reduceM` instead
+Use [`reduceM`](#reducem) instead
 
 **Signature**
 
@@ -536,7 +536,13 @@ Added in v2.0.0
 
 ## ~~getFoldableComposition~~
 
-Returns the composition of two foldables
+Use
+
+- [reduce](#reduce)
+- [foldMap](#foldmap)
+- [reduceRight](#reduceright)
+
+instead.
 
 **Signature**
 
@@ -576,7 +582,7 @@ Added in v2.0.0
 
 ## ~~toArray~~
 
-Use `toReadonlyArray` instead
+Use [`toReadonlyArray`](#toreadonlyarray) instead
 
 **Signature**
 
diff --git a/docs/modules/FoldableWithIndex.ts.md b/docs/modules/FoldableWithIndex.ts.md
index d768f1b2..48f411f8 100644
--- a/docs/modules/FoldableWithIndex.ts.md
+++ b/docs/modules/FoldableWithIndex.ts.md
@@ -346,6 +346,14 @@ Added in v2.0.0
 
 ## ~~getFoldableWithIndexComposition~~
 
+Use
+
+- [reduceWithIndex](#reducewithindex)
+- [foldMapWithIndex](#foldmapwithindex)
+- [reduceRightWithIndex](#reducerightwithindex)
+
+instead.
+
 **Signature**
 
 ```ts
diff --git a/docs/modules/Functor.ts.md b/docs/modules/Functor.ts.md
index 04e7eece..8c82bc8f 100644
--- a/docs/modules/Functor.ts.md
+++ b/docs/modules/Functor.ts.md
@@ -382,6 +382,8 @@ Added in v2.0.0
 
 ## ~~getFunctorComposition~~
 
+Use [`map`](#map) instead.
+
 **Signature**
 
 ```ts
diff --git a/docs/modules/FunctorWithIndex.ts.md b/docs/modules/FunctorWithIndex.ts.md
index d554de30..c48b1fae 100644
--- a/docs/modules/FunctorWithIndex.ts.md
+++ b/docs/modules/FunctorWithIndex.ts.md
@@ -265,6 +265,8 @@ Added in v2.0.0
 
 ## ~~getFunctorWithIndexComposition~~
 
+Use [`mapWithIndex`](#mapwithindex) instead.
+
 **Signature**
 
 ```ts
diff --git a/docs/modules/IO.ts.md b/docs/modules/IO.ts.md
index fbe5f608..18c4a9d3 100644
--- a/docs/modules/IO.ts.md
+++ b/docs/modules/IO.ts.md
@@ -316,7 +316,7 @@ Added in v2.0.0
 
 ## ~~getMonoid~~
 
-Use `Applicative.getApplicativeMonoid` instead.
+Use [`getApplicativeMonoid`](./Applicative.ts.html#getApplicativeMonoid) instead.
 
 **Signature**
 
@@ -328,7 +328,7 @@ Added in v2.0.0
 
 ## ~~getSemigroup~~
 
-Use `Apply.getApplySemigroup` instead.
+Use [`getApplySemigroup`](./Apply.ts.html#getApplySemigroup) instead.
 
 **Signature**
 
diff --git a/docs/modules/IOEither.ts.md b/docs/modules/IOEither.ts.md
index fef7342d..b5653038 100644
--- a/docs/modules/IOEither.ts.md
+++ b/docs/modules/IOEither.ts.md
@@ -142,9 +142,7 @@ Less strict version of [`alt`](#alt).
 **Signature**
 
 ```ts
-export declare const altW: <E2, B>(
-  that: Lazy<IOEither<E2, B>>
-) => <E1, A>(fa: IOEither<E1, A>) => IOEither<E2 | E1, B | A>
+export declare const altW: <E2, B>(that: Lazy<IOEither<E2, B>>) => <E1, A>(fa: IOEither<E1, A>) => IOEither<E2, B | A>
 ```
 
 Added in v2.9.0
@@ -312,7 +310,7 @@ Added in v2.4.0
 
 ## chainEitherKW
 
-Less strict version of [`chainEitherK`](#chainEitherK).
+Less strict version of [`chainEitherK`](#chaineitherk).
 
 **Signature**
 
@@ -351,7 +349,7 @@ Added in v2.10.0
 
 ## chainFirstW
 
-Less strict version of [`chainFirst`](#chainFirst).
+Less strict version of [`chainFirst`](#chainfirst).
 
 Derivable from `Chain`.
 
@@ -402,7 +400,7 @@ Added in v2.0.0
 
 ## filterOrElseW
 
-Less strict version of [`filterOrElse`](#filterOrElse).
+Less strict version of [`filterOrElse`](#filterorelse).
 
 **Signature**
 
@@ -487,7 +485,7 @@ Added in v2.0.0
 
 ## orElseW
 
-Less strict version of [`orElse`](#orElse).
+Less strict version of [`orElse`](#orelse).
 
 **Signature**
 
@@ -598,7 +596,7 @@ Added in v2.0.0
 
 ## fold
 
-Alias of [`matchE`](#matchE).
+Alias of [`matchE`](#matche).
 
 **Signature**
 
@@ -613,7 +611,7 @@ Added in v2.0.0
 
 ## foldW
 
-Alias of [`matchEW`](#matchEW).
+Alias of [`matchEW`](#matchew).
 
 **Signature**
 
@@ -638,7 +636,7 @@ Added in v2.0.0
 
 ## getOrElseW
 
-Less strict version of [`getOrElse`](#getOrElse).
+Less strict version of [`getOrElse`](#getorelse).
 
 **Signature**
 
@@ -673,7 +671,7 @@ Added in v2.10.0
 
 ## matchEW
 
-Less strict version of [`matchE`](#matchE).
+Less strict version of [`matchE`](#matche).
 
 **Signature**
 
@@ -895,7 +893,7 @@ Added in v2.1.0
 
 ## ~~Applicative~~
 
-Use `ApplicativePar` instead
+Use [`ApplicativePar`](#applicativepar) instead
 
 **Signature**
 
@@ -907,7 +905,7 @@ Added in v2.7.0
 
 ## ~~getApplyMonoid~~
 
-Use `Applicative.getApplicativeMonoid` instead.
+Use [`getApplicativeMonoid`](./Applicative.ts.html#getApplicativeMonoid) instead.
 
 **Signature**
 
@@ -919,10 +917,7 @@ Added in v2.0.0
 
 ## ~~getApplySemigroup~~
 
-Use `Apply.getApplySemigroup` instead.
-
-Semigroup returning the left-most `Left` value. If both operands are `Right`s then the inner values
-are concatenated using the provided `Semigroup`
+Use [`getApplySemigroup`](./Apply.ts.html#getApplySemigroup) instead.
 
 **Signature**
 
@@ -934,7 +929,7 @@ Added in v2.0.0
 
 ## ~~getIOValidation~~
 
-Use `getApplicativeIOValidation` and `getAltIOValidation`.
+Use [`getApplicativeIOValidation`](#getapplicativeiovalidation) and [`getAltIOValidation`](#getaltiovalidation).
 
 **Signature**
 
@@ -948,10 +943,7 @@ Added in v2.0.0
 
 ## ~~getSemigroup~~
 
-Use `Apply.getApplySemigroup` instead.
-
-Semigroup returning the left-most non-`Left` value. If both operands are `Right`s then the inner values are
-concatenated using the provided `Semigroup`
+Use [`getApplySemigroup`](./Apply.ts.html#getApplySemigroup) instead.
 
 **Signature**
 
@@ -993,7 +985,7 @@ Added in v2.10.0
 
 Constructs a new `IOEither` from a function that performs a side effect and might throw
 
-See also [`tryCatchK`](#tryCatchK).
+See also [`tryCatchK`](#trycatchk).
 
 **Signature**
 
diff --git a/docs/modules/Map.ts.md b/docs/modules/Map.ts.md
index 3601b090..1a3c43fa 100644
--- a/docs/modules/Map.ts.md
+++ b/docs/modules/Map.ts.md
@@ -253,7 +253,7 @@ Added in v2.0.0
 
 ## ~~insertAt~~
 
-Use `upsertAt` instead.
+Use [`upsertAt`](#upsertat) instead.
 
 **Signature**
 
@@ -419,7 +419,7 @@ Added in v2.0.0
 
 ## ~~map\_~~
 
-Use `Filterable` instead.
+Use [`Filterable`](#filterable) instead.
 
 **Signature**
 
diff --git a/docs/modules/Monoid.ts.md b/docs/modules/Monoid.ts.md
index 08d682fe..e8fbdcee 100644
--- a/docs/modules/Monoid.ts.md
+++ b/docs/modules/Monoid.ts.md
@@ -157,7 +157,7 @@ Added in v2.10.0
 
 ## ~~getDualMonoid~~
 
-Use `reverse` instead.
+Use [`reverse`](#reverse) instead.
 
 **Signature**
 
@@ -169,7 +169,7 @@ Added in v2.0.0
 
 ## ~~getStructMonoid~~
 
-Use `struct` instead.
+Use [`struct`](#struct) instead.
 
 **Signature**
 
@@ -183,7 +183,7 @@ Added in v2.0.0
 
 ## ~~getTupleMonoid~~
 
-Use `tuple` instead.
+Use [`tuple`](#tuple) instead.
 
 **Signature**
 
@@ -249,7 +249,7 @@ Added in v2.10.0
 
 ## ~~getJoinMonoid~~
 
-Use `max` instead.
+Use [`max`](#max) instead.
 
 **Signature**
 
@@ -261,7 +261,7 @@ Added in v2.0.0
 
 ## ~~getMeetMonoid~~
 
-Use `min` instead.
+Use [`min`](#min) instead.
 
 **Signature**
 
@@ -285,9 +285,9 @@ Added in v2.0.0
 
 ## ~~getEndomorphismMonoid~~
 
-Use `function.getEndomorphismMonoid` instead.
+Use [`getEndomorphismMonoid`](./function.ts.html#getEndomorphismMonoid) instead.
 
-**Note**. The execution order in `function.getEndomorphismMonoid` is reversed.
+**Note**. The execution order in [`getEndomorphismMonoid`](./function.ts.html#getEndomorphismMonoid) is reversed.
 
 **Signature**
 
@@ -299,7 +299,7 @@ Added in v2.0.0
 
 ## ~~getFunctionMonoid~~
 
-Use `function.getMonoid` instead.
+Use [`getMonoid`](./function.ts.html#getMonoid) instead.
 
 **Signature**
 
@@ -311,7 +311,7 @@ Added in v2.0.0
 
 ## ~~monoidAll~~
 
-Use `boolean.MonoidAll` instead.
+Use [`MonoidAll`](./boolean.ts.html#monoidall) instead.
 
 **Signature**
 
@@ -323,7 +323,7 @@ Added in v2.0.0
 
 ## ~~monoidAny~~
 
-Use `boolean.MonoidAny` instead.
+Use [`MonoidAny`](./boolean.ts.html#MonoidAny) instead.
 
 **Signature**
 
@@ -335,6 +335,8 @@ Added in v2.0.0
 
 ## ~~monoidProduct~~
 
+Use [`MonoidProduct`](./number.ts.html#MonoidProduct) instead.
+
 **Signature**
 
 ```ts
@@ -345,7 +347,7 @@ Added in v2.0.0
 
 ## ~~monoidString~~
 
-Use `string.Monoid` instead.
+Use [`Monoid`](./string.ts.html#Monoid) instead.
 
 **Signature**
 
@@ -357,7 +359,7 @@ Added in v2.0.0
 
 ## ~~monoidSum~~
 
-Use `number.MonoidSum` instead.
+Use [`MonoidSum`](./number.ts.html#MonoidSum) instead.
 
 **Signature**
 
@@ -409,7 +411,7 @@ Added in v2.10.0
 
 ## ~~fold~~
 
-Use `concatAll` instead.
+Use [`concatAll`](#concatall) instead.
 
 **Signature**
 
diff --git a/docs/modules/NonEmptyArray.ts.md b/docs/modules/NonEmptyArray.ts.md
index f7dacd50..5a0c0982 100644
--- a/docs/modules/NonEmptyArray.ts.md
+++ b/docs/modules/NonEmptyArray.ts.md
@@ -648,7 +648,7 @@ Added in v2.5.1
 
 ## ~~filterWithIndex~~
 
-Use `Array`'s `filterWithIndex` instead.
+Use [`filterWithIndex`](./Array.ts.html#filterWithIndex) instead.
 
 **Signature**
 
@@ -662,7 +662,7 @@ Added in v2.0.0
 
 ## ~~filter~~
 
-Use `Array`'s `filter` instead.
+Use [`filter`](./Array.ts.html#filter) instead.
 
 **Signature**
 
@@ -677,7 +677,7 @@ Added in v2.0.0
 
 ## ~~prependToAll~~
 
-Use `prependAll` instead.
+Use [`prependAll`](#prependall) instead.
 
 **Signature**
 
@@ -713,7 +713,7 @@ Added in v2.10.0
 
 ## ~~cons~~
 
-Use `Array`'s `prepend` instead.
+Use [`prepend`](./Array.ts.html#prepend) instead.
 
 **Signature**
 
@@ -726,7 +726,7 @@ Added in v2.0.0
 
 ## ~~snoc~~
 
-Use `Array`'s `append` instead.
+Use [`append`](./Array.ts.html#append) instead.
 
 **Signature**
 
@@ -780,7 +780,7 @@ Added in v2.9.0
 
 ## ~~uncons~~
 
-Use `unprepend` instead.
+Use [`unprepend`](#unprepend) instead.
 
 **Signature**
 
@@ -792,7 +792,7 @@ Added in v2.9.0
 
 ## ~~unsnoc~~
 
-Use `unappend` instead.
+Use [`unappend`](#unappend) instead.
 
 **Signature**
 
@@ -1200,7 +1200,7 @@ Added in v2.6.3
 
 ## ~~fold~~
 
-Use `concatAll` instead.
+Use [`concatAll`](#concatall) instead.
 
 **Signature**
 
diff --git a/docs/modules/Option.ts.md b/docs/modules/Option.ts.md
index 6bd2e96d..329b71d8 100644
--- a/docs/modules/Option.ts.md
+++ b/docs/modules/Option.ts.md
@@ -509,6 +509,8 @@ Added in v2.0.0
 
 ## ~~mapNullable~~
 
+Use [`chainNullableK`](#chainnullablek) instead.
+
 **Signature**
 
 ```ts
@@ -523,7 +525,7 @@ Added in v2.0.0
 
 Transforms an `Either` to an `Option` discarding the error.
 
-Alias of [getRight](#getRight)
+Alias of [getRight](#getright)
 
 **Signature**
 
@@ -641,7 +643,7 @@ Added in v2.0.0
 
 ## foldW
 
-Alias of [`matchW`](#matchW).
+Alias of [`matchW`](#matchw).
 
 **Signature**
 
@@ -687,7 +689,7 @@ Added in v2.0.0
 
 ## getOrElseW
 
-Less strict version of [`getOrElse`](#getOrElse).
+Less strict version of [`getOrElse`](#getorelse).
 
 **Signature**
 
@@ -1128,7 +1130,7 @@ Added in v2.0.0
 
 ## ~~getApplyMonoid~~
 
-Use `Applicative.getApplicativeMonoid` instead.
+Use [`getApplicativeMonoid`](./Applicative.ts.html#getApplicativeMonoid) instead.
 
 **Signature**
 
@@ -1140,7 +1142,7 @@ Added in v2.0.0
 
 ## ~~getApplySemigroup~~
 
-Use `Apply.getApplySemigroup` instead.
+Use [`getApplySemigroup`](./Apply.ts.html#getApplySemigroup) instead.
 
 **Signature**
 
@@ -1324,7 +1326,7 @@ Added in v2.0.0
 Transforms an exception into an `Option`. If `f` throws, returns `None`, otherwise returns the output wrapped in a
 `Some`.
 
-See also [`tryCatchK`](#tryCatchK).
+See also [`tryCatchK`](#trycatchk).
 
 **Signature**
 
diff --git a/docs/modules/Ord.ts.md b/docs/modules/Ord.ts.md
index 1dda3478..a570f4dd 100644
--- a/docs/modules/Ord.ts.md
+++ b/docs/modules/Ord.ts.md
@@ -108,7 +108,7 @@ Added in v2.10.0
 
 ## ~~getDualOrd~~
 
-Use `reverse` instead.
+Use [`reverse`](#reverse) instead.
 
 **Signature**
 
@@ -120,7 +120,7 @@ Added in v2.0.0
 
 ## ~~getTupleOrd~~
 
-Use `tuple` instead.
+Use [`tuple`](#tuple) instead.
 
 **Signature**
 
@@ -276,7 +276,7 @@ Added in v2.0.0
 
 ## ~~ordBoolean~~
 
-Use `boolean.Ord` instead.
+Use [`Ord`](./boolean.ts.html#Ord) instead.
 
 **Signature**
 
@@ -288,7 +288,7 @@ Added in v2.0.0
 
 ## ~~ordDate~~
 
-Use `Date.Ord` instead.
+Use [`Ord`](./Date.ts.html#Ord) instead.
 
 **Signature**
 
@@ -300,7 +300,7 @@ Added in v2.0.0
 
 ## ~~ordNumber~~
 
-Use `number.Ord` instead.
+Use [`Ord`](./number.ts.html#Ord) instead.
 
 **Signature**
 
@@ -312,7 +312,7 @@ Added in v2.0.0
 
 ## ~~ordString~~
 
-Use `string.Ord` instead.
+Use [`Ord`](./string.ts.html#Ord) instead.
 
 **Signature**
 
@@ -324,7 +324,7 @@ Added in v2.0.0
 
 ## ~~ord~~
 
-Use `Contravariant` instead.
+Use [`Contravariant`](#contravariant) instead.
 
 **Signature**
 
diff --git a/docs/modules/Ordering.ts.md b/docs/modules/Ordering.ts.md
index 66472aab..ae81f5ee 100644
--- a/docs/modules/Ordering.ts.md
+++ b/docs/modules/Ordering.ts.md
@@ -89,7 +89,7 @@ Added in v2.10.0
 
 ## ~~eqOrdering~~
 
-Use `Eq` instead
+Use [`Eq`](#eq) instead
 
 **Signature**
 
@@ -101,7 +101,7 @@ Added in v2.0.0
 
 ## ~~monoidOrdering~~
 
-Use `Monoid` instead
+Use [`Monoid`](#monoid) instead
 
 **Signature**
 
@@ -113,7 +113,7 @@ Added in v2.4.0
 
 ## ~~semigroupOrdering~~
 
-Use `Semigroup` instead
+Use [`Semigroup`](#semigroup) instead
 
 **Signature**
 
@@ -149,7 +149,7 @@ Added in v2.0.0
 
 ## ~~invert~~
 
-Use `reverse` instead.
+Use [`reverse`](#reverse) instead.
 
 **Signature**
 
diff --git a/docs/modules/Reader.ts.md b/docs/modules/Reader.ts.md
index 2ed0f026..55e1c16c 100644
--- a/docs/modules/Reader.ts.md
+++ b/docs/modules/Reader.ts.md
@@ -466,7 +466,7 @@ Added in v2.0.0
 
 ## ~~getMonoid~~
 
-Use `Applicative.getApplicativeMonoid` instead.
+Use [`getApplicativeMonoid`](./Applicative.ts.html#getApplicativeMonoid) instead.
 
 **Signature**
 
@@ -478,7 +478,7 @@ Added in v2.0.0
 
 ## ~~getSemigroup~~
 
-Use `Apply.getApplySemigroup` instead.
+Use [`getApplySemigroup`](./Apply.ts.html#getApplySemigroup) instead.
 
 **Signature**
 
diff --git a/docs/modules/ReaderEither.ts.md b/docs/modules/ReaderEither.ts.md
index 1c0d6b3f..20144835 100644
--- a/docs/modules/ReaderEither.ts.md
+++ b/docs/modules/ReaderEither.ts.md
@@ -132,7 +132,7 @@ Less strict version of [`alt`](#alt).
 ```ts
 export declare const altW: <R2, E2, B>(
   that: () => ReaderEither<R2, E2, B>
-) => <R1, E1, A>(fa: ReaderEither<R1, E1, A>) => ReaderEither<R1 & R2, E2 | E1, B | A>
+) => <R1, E1, A>(fa: ReaderEither<R1, E1, A>) => ReaderEither<R1 & R2, E2, B | A>
 ```
 
 Added in v2.9.0
@@ -313,7 +313,7 @@ Added in v2.4.0
 
 ## chainEitherKW
 
-Less strict version of [`chainEitherK`](#chainEitherK).
+Less strict version of [`chainEitherK`](#chaineitherk).
 
 **Signature**
 
@@ -344,7 +344,7 @@ Added in v2.0.0
 
 ## chainFirstW
 
-Less strict version of [`chainFirst`](#chainFirst)
+Less strict version of [`chainFirst`](#chainfirst)
 
 Derivable from `Chain`.
 
@@ -387,7 +387,7 @@ Added in v2.0.0
 
 ## filterOrElseW
 
-Less strict version of [`filterOrElse`](#filterOrElse).
+Less strict version of [`filterOrElse`](#filterorelse).
 
 **Signature**
 
@@ -466,7 +466,7 @@ Added in v2.0.0
 
 ## orElseW
 
-Less strict version of [`orElse`](#orElse).
+Less strict version of [`orElse`](#orelse).
 
 **Signature**
 
@@ -490,7 +490,7 @@ Added in v2.0.0
 
 ## ~~local~~
 
-Use `Reader`'s `local` instead.
+Use [`local`](./Reader.ts.html#local) instead.
 
 **Signature**
 
@@ -599,7 +599,7 @@ Added in v2.0.0
 
 ## fold
 
-Alias of [`matchE`](#matchE).
+Alias of [`matchE`](#matche).
 
 **Signature**
 
@@ -614,7 +614,7 @@ Added in v2.0.0
 
 ## foldW
 
-Alias of [`matchEW`](#matchEW).
+Alias of [`matchEW`](#matchew).
 
 **Signature**
 
@@ -641,7 +641,7 @@ Added in v2.0.0
 
 ## getOrElseW
 
-Less strict version of [`getOrElse`](#getOrElse).
+Less strict version of [`getOrElse`](#getorelse).
 
 **Signature**
 
@@ -681,7 +681,7 @@ Added in v2.10.0
 
 ## matchEW
 
-Less strict version of [`matchE`](#matchE).
+Less strict version of [`matchE`](#matche).
 
 **Signature**
 
@@ -873,7 +873,7 @@ Added in v2.10.0
 
 ## ~~getApplyMonoid~~
 
-Use `Applicative.getApplicativeMonoid` instead.
+Use [`getApplicativeMonoid`](./Applicative.ts.html#getApplicativeMonoid) instead.
 
 **Signature**
 
@@ -885,10 +885,7 @@ Added in v2.0.0
 
 ## ~~getApplySemigroup~~
 
-Use `Apply.getApplySemigroup` instead.
-
-Semigroup returning the left-most `Left` value. If both operands are `Right`s then the inner values
-are concatenated using the provided `Semigroup`
+Use [`getApplySemigroup`](./Apply.ts.html#getApplySemigroup) instead.
 
 **Signature**
 
@@ -900,7 +897,7 @@ Added in v2.0.0
 
 ## ~~getReaderValidation~~
 
-Use `getApplicativeReaderValidation` and `getAltReaderValidation` instead.
+Use [`getApplicativeReaderValidation`](#getapplicativereadervalidation) and [`getAltReaderValidation`](#getaltreadervalidation) instead.
 
 **Signature**
 
@@ -914,10 +911,7 @@ Added in v2.3.0
 
 ## ~~getSemigroup~~
 
-Use `Apply.getApplySemigroup` instead.
-
-Semigroup returning the left-most non-`Left` value. If both operands are `Right`s then the inner values are
-concatenated using the provided `Semigroup`
+Use [`getApplySemigroup`](./Apply.ts.html#getApplySemigroup) instead.
 
 **Signature**
 
diff --git a/docs/modules/ReaderTask.ts.md b/docs/modules/ReaderTask.ts.md
index 481fdd75..b19a022c 100644
--- a/docs/modules/ReaderTask.ts.md
+++ b/docs/modules/ReaderTask.ts.md
@@ -295,7 +295,7 @@ Added in v2.4.0
 
 ## ~~local~~
 
-Use `Reader`'s `local` instead.
+Use [`local`](./Reader.ts.html#local) instead.
 
 **Signature**
 
@@ -501,7 +501,7 @@ Added in v2.3.0
 
 ## ~~getMonoid~~
 
-Use `Applicative.getApplicativeMonoid` instead.
+Use [`getApplicativeMonoid`](./Applicative.ts.html#getApplicativeMonoid) instead.
 
 **Signature**
 
@@ -513,7 +513,7 @@ Added in v2.3.0
 
 ## ~~getSemigroup~~
 
-Use `Apply.getApplySemigroup` instead.
+Use [`getApplySemigroup`](./Apply.ts.html#getApplySemigroup) instead.
 
 **Signature**
 
diff --git a/docs/modules/ReaderTaskEither.ts.md b/docs/modules/ReaderTaskEither.ts.md
index 895ea183..47460273 100644
--- a/docs/modules/ReaderTaskEither.ts.md
+++ b/docs/modules/ReaderTaskEither.ts.md
@@ -167,7 +167,7 @@ Less strict version of [`alt`](#alt).
 ```ts
 export declare const altW: <R2, E2, B>(
   that: () => ReaderTaskEither<R2, E2, B>
-) => <R1, E1, A>(fa: ReaderTaskEither<R1, E1, A>) => ReaderTaskEither<R1 & R2, E2 | E1, B | A>
+) => <R1, E1, A>(fa: ReaderTaskEither<R1, E1, A>) => ReaderTaskEither<R1 & R2, E2, B | A>
 ```
 
 Added in v2.9.0
@@ -350,7 +350,7 @@ Added in v2.4.0
 
 ## chainEitherKW
 
-Less strict version of [`chainEitherK`](#chainEitherK).
+Less strict version of [`chainEitherK`](#chaineitherk).
 
 **Signature**
 
@@ -405,7 +405,7 @@ Added in v2.10.0
 
 ## chainFirstW
 
-Less strict version of [`chainFirst`](#chainFirst).
+Less strict version of [`chainFirst`](#chainfirst).
 
 Derivable from `Chain`.
 
@@ -433,7 +433,7 @@ Added in v2.4.0
 
 ## chainIOEitherKW
 
-Less strict version of [`chainIOEitherK`](#chainIOEitherK).
+Less strict version of [`chainIOEitherK`](#chainioeitherk).
 
 **Signature**
 
@@ -483,7 +483,7 @@ Added in v2.4.0
 
 ## chainTaskEitherKW
 
-Less strict version of [`chainTaskEitherK`](#chainTaskEitherK).
+Less strict version of [`chainTaskEitherK`](#chaintaskeitherk).
 
 **Signature**
 
@@ -524,7 +524,7 @@ Added in v2.0.0
 
 ## filterOrElseW
 
-Less strict version of [`filterOrElse`](#filterOrElse).
+Less strict version of [`filterOrElse`](#filterorelse).
 
 **Signature**
 
@@ -649,7 +649,7 @@ Added in v2.0.0
 
 ## orElseW
 
-Less strict version of [`orElse`](#orElse).
+Less strict version of [`orElse`](#orelse).
 
 **Signature**
 
@@ -673,7 +673,7 @@ Added in v2.0.0
 
 ## ~~local~~
 
-Use `Reader`'s `local` instead.
+Use [`local`](./Reader.ts.html#local) instead.
 
 **Signature**
 
@@ -894,7 +894,7 @@ Added in v2.0.0
 
 ## fold
 
-Alias of [`matchE`](#matchE).
+Alias of [`matchE`](#matche).
 
 **Signature**
 
@@ -909,7 +909,7 @@ Added in v2.0.0
 
 ## foldW
 
-Alias of [`matchEW`](#matchEW).
+Alias of [`matchEW`](#matchew).
 
 **Signature**
 
@@ -936,7 +936,7 @@ Added in v2.0.0
 
 ## getOrElseW
 
-Less strict version of [`getOrElse`](#getOrElse).
+Less strict version of [`getOrElse`](#getorelse).
 
 **Signature**
 
@@ -976,7 +976,7 @@ Added in v2.10.0
 
 ## matchEW
 
-Less strict version of [`matchE`](#matchE).
+Less strict version of [`matchE`](#matche).
 
 **Signature**
 
@@ -1228,7 +1228,7 @@ Added in v2.10.0
 
 ## ~~getApplyMonoid~~
 
-Use `Applicative.getApplicativeMonoid` instead.
+Use [`getApplicativeMonoid`](./Applicative.ts.html#getApplicativeMonoid) instead.
 
 **Signature**
 
@@ -1240,7 +1240,7 @@ Added in v2.0.0
 
 ## ~~getApplySemigroup~~
 
-Use `Apply.getApplySemigroup` instead.
+Use [`getApplySemigroup`](./Apply.ts.html#getApplySemigroup) instead.
 
 Semigroup returning the left-most `Left` value. If both operands are `Right`s then the inner values
 are concatenated using the provided `Semigroup`
@@ -1255,7 +1255,7 @@ Added in v2.0.0
 
 ## ~~getReaderTaskValidation~~
 
-Use `getApplicativeReaderTaskValidation` and `getAltReaderTaskValidation` instead.
+Use [`getApplicativeReaderTaskValidation`](#getapplicativereadertaskvalidation) and [`getAltReaderTaskValidation`](#getaltreadertaskvalidation) instead.
 
 **Signature**
 
@@ -1269,10 +1269,7 @@ Added in v2.3.0
 
 ## ~~getSemigroup~~
 
-Use `Apply.getApplySemigroup` instead.
-
-Semigroup returning the left-most non-`Left` value. If both operands are `Right`s then the inner values are
-concatenated using the provided `Semigroup`
+Use [`getApplySemigroup`](./Apply.ts.html#getApplySemigroup) instead.
 
 **Signature**
 
diff --git a/docs/modules/ReadonlyArray.ts.md b/docs/modules/ReadonlyArray.ts.md
index fba91985..efd7dcbc 100644
--- a/docs/modules/ReadonlyArray.ts.md
+++ b/docs/modules/ReadonlyArray.ts.md
@@ -1338,7 +1338,7 @@ Added in v2.5.0
 
 ## ~~prependToAll~~
 
-Use `prependAll` instead.
+Use [`prependAll`](#prependall) instead.
 
 **Signature**
 
@@ -1459,7 +1459,7 @@ Added in v2.5.0
 
 ## ~~cons~~
 
-Use `prepend` instead.
+Use [`prepend`](#prepend) instead.
 
 **Signature**
 
@@ -1471,7 +1471,7 @@ Added in v2.5.0
 
 ## ~~snoc~~
 
-Use `append` instead.
+Use [`append`](#append) instead.
 
 **Signature**
 
@@ -1485,7 +1485,7 @@ Added in v2.5.0
 
 ## foldLeft
 
-Alias of [`matchLeft`](#matchLeft).
+Alias of [`matchLeft`](#matchleft).
 
 **Signature**
 
@@ -1500,7 +1500,7 @@ Added in v2.5.0
 
 ## foldRight
 
-Alias of [`matchRight`](#matchRight).
+Alias of [`matchRight`](#matchright).
 
 **Signature**
 
diff --git a/docs/modules/ReadonlyMap.ts.md b/docs/modules/ReadonlyMap.ts.md
index 0fd6a94c..6d130cc2 100644
--- a/docs/modules/ReadonlyMap.ts.md
+++ b/docs/modules/ReadonlyMap.ts.md
@@ -265,7 +265,7 @@ Added in v2.10.0
 
 ## ~~insertAt~~
 
-Use `upsertAt` instead.
+Use [`upsertAt`](#upsertat) instead.
 
 **Signature**
 
diff --git a/docs/modules/ReadonlyNonEmptyArray.ts.md b/docs/modules/ReadonlyNonEmptyArray.ts.md
index d892e85f..db7a32ad 100644
--- a/docs/modules/ReadonlyNonEmptyArray.ts.md
+++ b/docs/modules/ReadonlyNonEmptyArray.ts.md
@@ -731,7 +731,7 @@ Added in v2.5.1
 
 ## ~~filterWithIndex~~
 
-Use `ReadonlyArray`'s `filterWithIndex` instead.
+Use [`filterWithIndex`](./ReadonlyArray.ts.html#filterWithIndex) instead.
 
 **Signature**
 
@@ -745,7 +745,7 @@ Added in v2.5.0
 
 ## ~~filter~~
 
-Use `ReadonlyArray`'s `filter` instead.
+Use [`filter`](./ReadonlyArray.ts.html#filter) instead.
 
 **Signature**
 
@@ -762,7 +762,7 @@ Added in v2.5.0
 
 ## ~~insertAt~~
 
-Use `ReadonlyArray`'s `insertAt` instead.
+Use [`insertAt`](./ReadonlyArray.ts.html#insertAt) instead.
 
 **Signature**
 
@@ -774,7 +774,7 @@ Added in v2.5.0
 
 ## ~~prependToAll~~
 
-Use `prependAll` instead.
+Use [`prependAll`](#prependall) instead.
 
 **Signature**
 
@@ -800,7 +800,7 @@ Added in v2.5.0
 
 ## ~~cons~~
 
-Use `ReadonlyArray`'s `prepend` instead.
+Use [`prepend`](./ReadonlyArray.ts.html#prepend) instead.
 
 **Signature**
 
@@ -813,7 +813,7 @@ Added in v2.5.0
 
 ## ~~snoc~~
 
-Use `ReadonlyArray`'s `append` instead.
+Use [`append`](./ReadonlyArray.ts.html#append) instead.
 
 **Signature**
 
@@ -867,7 +867,7 @@ Added in v2.9.0
 
 ## ~~uncons~~
 
-Use `unprepend` instead.
+Use [`unprepend`](#unprepend) instead.
 
 **Signature**
 
@@ -879,7 +879,7 @@ Added in v2.10.0
 
 ## ~~unsnoc~~
 
-Use `unappend` instead.
+Use [`unappend`](#unappend) instead.
 
 **Signature**
 
@@ -1264,7 +1264,7 @@ Added in v2.5.0
 
 ## ~~fold~~
 
-Use `concatAll` instead.
+Use [`concatAll`](#concatall) instead.
 
 **Signature**
 
diff --git a/docs/modules/ReadonlyRecord.ts.md b/docs/modules/ReadonlyRecord.ts.md
index c3b44c00..c7ef7673 100644
--- a/docs/modules/ReadonlyRecord.ts.md
+++ b/docs/modules/ReadonlyRecord.ts.md
@@ -306,7 +306,7 @@ Added in v2.10.0
 
 ## ~~insertAt~~
 
-Use `upsertAt` instead.
+Use [`upsertAt`](#upsertat) instead.
 
 **Signature**
 
@@ -1042,7 +1042,7 @@ Added in v2.5.0
 
 ## ~~hasOwnProperty (function)~~
 
-Use `has` instead.
+Use [`has`](#has) instead.
 
 **Signature**
 
diff --git a/docs/modules/ReadonlySet.ts.md b/docs/modules/ReadonlySet.ts.md
index 0878364e..99af9c65 100644
--- a/docs/modules/ReadonlySet.ts.md
+++ b/docs/modules/ReadonlySet.ts.md
@@ -245,7 +245,7 @@ Added in v2.5.0
 
 ## ~~fromArray~~
 
-Use `fromReadonlyArray` instead.
+Use [`fromReadonlyArray`](#fromreadonlyarray) instead.
 
 **Signature**
 
diff --git a/docs/modules/ReadonlyTuple.ts.md b/docs/modules/ReadonlyTuple.ts.md
index 30ae3942..c6145004 100644
--- a/docs/modules/ReadonlyTuple.ts.md
+++ b/docs/modules/ReadonlyTuple.ts.md
@@ -402,7 +402,7 @@ Added in v2.6.3
 
 ## ~~mapLeft~~
 
-Use `mapSnd` instead.
+Use [`mapSnd`](#mapsnd) instead.
 
 **Signature**
 
@@ -414,7 +414,7 @@ Added in v2.5.0
 
 ## ~~map~~
 
-Use `mapFst` instead.
+Use [`mapFst`](#mapfst) instead.
 
 **Signature**
 
diff --git a/docs/modules/Record.ts.md b/docs/modules/Record.ts.md
index fa477016..4bcc06c2 100644
--- a/docs/modules/Record.ts.md
+++ b/docs/modules/Record.ts.md
@@ -955,7 +955,7 @@ Added in v2.0.0
 
 ## ~~hasOwnProperty (function)~~
 
-Use `has` instead.
+Use [`has`](#has) instead.
 
 **Signature**
 
@@ -967,7 +967,7 @@ Added in v2.0.0
 
 ## ~~insertAt~~
 
-Use `upsertAt` instead.
+Use [`upsertAt`](#upsertat) instead.
 
 **Signature**
 
diff --git a/docs/modules/Ring.ts.md b/docs/modules/Ring.ts.md
index 5d44a01c..fa88752c 100644
--- a/docs/modules/Ring.ts.md
+++ b/docs/modules/Ring.ts.md
@@ -64,7 +64,7 @@ Added in v2.10.0
 
 ## ~~getTupleRing~~
 
-Use `tuple` instead.
+Use [`tuple`](#tuple) instead.
 
 **Signature**
 
@@ -80,7 +80,7 @@ Added in v2.0.0
 
 ## ~~getFunctionRing~~
 
-Use `function.getRing` instead.
+Use [`getRing`](./function.ts.html#getRing) instead.
 
 **Signature**
 
diff --git a/docs/modules/Semigroup.ts.md b/docs/modules/Semigroup.ts.md
index 80c1d755..ccb6ec9b 100644
--- a/docs/modules/Semigroup.ts.md
+++ b/docs/modules/Semigroup.ts.md
@@ -195,7 +195,7 @@ Added in v2.10.0
 
 ## ~~getDualSemigroup~~
 
-Use `reverse` instead.
+Use [`reverse`](#reverse) instead.
 
 **Signature**
 
@@ -207,7 +207,7 @@ Added in v2.0.0
 
 ## ~~getIntercalateSemigroup~~
 
-Use `intercalate` instead.
+Use [`intercalate`](#intercalate) instead.
 
 **Signature**
 
@@ -219,7 +219,7 @@ Added in v2.5.0
 
 ## ~~getStructSemigroup~~
 
-Use `struct` instead.
+Use [`struct`](#struct) instead.
 
 **Signature**
 
@@ -233,7 +233,7 @@ Added in v2.0.0
 
 ## ~~getTupleSemigroup~~
 
-Use `tuple` instead.
+Use [`tuple`](#tuple) instead.
 
 **Signature**
 
@@ -305,7 +305,7 @@ Added in v2.10.0
 
 ## ~~getJoinSemigroup~~
 
-Use `max` instead.
+Use [`max`](#max) instead.
 
 **Signature**
 
@@ -317,7 +317,7 @@ Added in v2.0.0
 
 ## ~~getMeetSemigroup~~
 
-Use `min` instead.
+Use [`min`](#min) instead.
 
 **Signature**
 
@@ -381,7 +381,7 @@ Added in v2.0.0
 
 ## ~~getFirstSemigroup~~
 
-Use `first` instead.
+Use [`first`](#first) instead.
 
 **Signature**
 
@@ -393,7 +393,7 @@ Added in v2.0.0
 
 ## ~~getFunctionSemigroup~~
 
-Use `function.getSemigroup` instead.
+Use [`getSemigroup`](./function.ts.html#getSemigroup) instead.
 
 **Signature**
 
@@ -405,7 +405,7 @@ Added in v2.0.0
 
 ## ~~getLastSemigroup~~
 
-Use `last` instead.
+Use [`last`](#last) instead.
 
 **Signature**
 
@@ -417,7 +417,7 @@ Added in v2.0.0
 
 ## ~~getObjectSemigroup~~
 
-Use `object.getAssignSemigroup` instead.
+Use [`getAssignSemigroup`](./struct.ts.html#getAssignSemigroup) instead.
 
 **Signature**
 
@@ -429,7 +429,7 @@ Added in v2.0.0
 
 ## ~~semigroupAll~~
 
-Use `boolean.SemigroupAll` instead.
+Use [`SemigroupAll`](./boolean.ts.html#SemigroupAll) instead.
 
 **Signature**
 
@@ -441,7 +441,7 @@ Added in v2.0.0
 
 ## ~~semigroupAny~~
 
-Use `boolean.SemigroupAny` instead.
+Use [`SemigroupAny`](./boolean.ts.html#SemigroupAny) instead.
 
 **Signature**
 
@@ -453,7 +453,7 @@ Added in v2.0.0
 
 ## ~~semigroupProduct~~
 
-Use `number.SemigroupProduct` instead.
+Use [`SemigroupProduct`](./number.ts.html#SemigroupProduct) instead.
 
 **Signature**
 
@@ -465,7 +465,7 @@ Added in v2.0.0
 
 ## ~~semigroupString~~
 
-Use `string.Semigroup` instead.
+Use [`Semigroup`](./string.ts.html#Semigroup) instead.
 
 **Signature**
 
@@ -477,7 +477,7 @@ Added in v2.0.0
 
 ## ~~semigroupSum~~
 
-Use `number.SemigroupSum` instead.
+Use [`SemigroupSum`](./number.ts.html#SemigroupSum) instead.
 
 **Signature**
 
@@ -529,7 +529,7 @@ Added in v2.10.0
 
 ## ~~fold~~
 
-Use `concatAll` instead.
+Use [`concatAll`](#concatall) instead.
 
 **Signature**
 
diff --git a/docs/modules/Semiring.ts.md b/docs/modules/Semiring.ts.md
index 2dc848d7..cce15a64 100644
--- a/docs/modules/Semiring.ts.md
+++ b/docs/modules/Semiring.ts.md
@@ -43,7 +43,7 @@ Added in v2.0.0
 
 ## ~~getFunctionSemiring~~
 
-Use `function.getSemiring` instead.
+Use [`getSemiring`](./function.ts.html#getSemiring) instead.
 
 **Signature**
 
diff --git a/docs/modules/Set.ts.md b/docs/modules/Set.ts.md
index 2861fd36..0ea01f00 100644
--- a/docs/modules/Set.ts.md
+++ b/docs/modules/Set.ts.md
@@ -423,7 +423,7 @@ Added in v2.0.0
 
 ## ~~subset~~
 
-Use `isSubset` instead.
+Use [`isSubset`](#issubset) instead.
 
 **Signature**
 
diff --git a/docs/modules/Show.ts.md b/docs/modules/Show.ts.md
index a21ec943..e0939254 100644
--- a/docs/modules/Show.ts.md
+++ b/docs/modules/Show.ts.md
@@ -59,7 +59,7 @@ Added in v2.10.0
 
 ## ~~getStructShow~~
 
-Use `struct` instead.
+Use [`struct`](#struct) instead.
 
 **Signature**
 
@@ -73,7 +73,7 @@ Added in v2.0.0
 
 ## ~~getTupleShow~~
 
-Use `tuple` instead.
+Use [`tuple`](#tuple) instead.
 
 **Signature**
 
@@ -89,7 +89,7 @@ Added in v2.0.0
 
 ## ~~showBoolean~~
 
-Use `boolean.Show` instead.
+Use [`Show`](./boolean.ts.html#Show) instead.
 
 **Signature**
 
@@ -101,7 +101,7 @@ Added in v2.0.0
 
 ## ~~showNumber~~
 
-Use `number.Show` instead.
+Use [`Show`](./number.ts.html#Show) instead.
 
 **Signature**
 
@@ -113,7 +113,7 @@ Added in v2.0.0
 
 ## ~~showString~~
 
-Use `string.Show` instead.
+Use [`Show`](./string.ts.html#Show) instead.
 
 **Signature**
 
diff --git a/docs/modules/State.ts.md b/docs/modules/State.ts.md
index 06a698f1..ff31ce98 100644
--- a/docs/modules/State.ts.md
+++ b/docs/modules/State.ts.md
@@ -441,7 +441,7 @@ Added in v2.9.0
 
 ## ~~evalState~~
 
-Use `evaluate` instead
+Use [`evaluate`](#evaluate) instead
 
 **Signature**
 
@@ -453,7 +453,7 @@ Added in v2.0.0
 
 ## ~~execState~~
 
-Use `execute` instead
+Use [`execute`](#execute) instead
 
 **Signature**
 
diff --git a/docs/modules/StateReaderTaskEither.ts.md b/docs/modules/StateReaderTaskEither.ts.md
index 49869c2c..3b7cbc19 100644
--- a/docs/modules/StateReaderTaskEither.ts.md
+++ b/docs/modules/StateReaderTaskEither.ts.md
@@ -148,7 +148,7 @@ Less strict version of [`alt`](#alt).
 ```ts
 export declare const altW: <S, R2, E2, B>(
   that: () => StateReaderTaskEither<S, R2, E2, B>
-) => <R1, E1, A>(fa: StateReaderTaskEither<S, R1, E1, A>) => StateReaderTaskEither<S, R1 & R2, E2 | E1, B | A>
+) => <R1, E1, A>(fa: StateReaderTaskEither<S, R1, E1, A>) => StateReaderTaskEither<S, R1 & R2, E2, B | A>
 ```
 
 Added in v2.9.0
@@ -333,7 +333,7 @@ Added in v2.4.0
 
 ## chainEitherKW
 
-Less strict version of [`chainEitherK`](#chainEitherK).
+Less strict version of [`chainEitherK`](#chaineitherk).
 
 **Signature**
 
@@ -388,7 +388,7 @@ Added in v2.10.0
 
 ## chainFirstW
 
-Less strict version of [`chainFirst`](#chainFirst).
+Less strict version of [`chainFirst`](#chainfirst).
 
 Derivable from `Chain`.
 
@@ -416,7 +416,7 @@ Added in v2.4.0
 
 ## chainIOEitherKW
 
-Less strict version of [`chainIOEitherK`](#chainIOEitherK).
+Less strict version of [`chainIOEitherK`](#chainioeitherk).
 
 **Signature**
 
@@ -468,7 +468,7 @@ Added in v2.4.0
 
 ## chainReaderTaskEitherKW
 
-Less strict version of [`chainReaderTaskEitherK`](#chainReaderTaskEitherK).
+Less strict version of [`chainReaderTaskEitherK`](#chainreadertaskeitherk).
 
 **Signature**
 
@@ -494,7 +494,7 @@ Added in v2.4.0
 
 ## chainTaskEitherKW
 
-Less strict version of [`chainTaskEitherK`](#chainTaskEitherK).
+Less strict version of [`chainTaskEitherK`](#chaintaskeitherk).
 
 **Signature**
 
@@ -537,7 +537,7 @@ Added in v2.4.4
 
 ## filterOrElseW
 
-Less strict version of [`filterOrElse`](#filterOrElse).
+Less strict version of [`filterOrElse`](#filterorelse).
 
 **Signature**
 
@@ -1275,7 +1275,7 @@ Added in v2.9.0
 
 ## ~~evalState~~
 
-Use `evaluate` instead
+Use [`evaluate`](#evaluate) instead
 
 **Signature**
 
@@ -1290,7 +1290,7 @@ Added in v2.0.0
 
 ## ~~execState~~
 
-Use `execute` instead
+Use [`execute`](#execute) instead
 
 **Signature**
 
diff --git a/docs/modules/Strong.ts.md b/docs/modules/Strong.ts.md
index b4ea6201..3e01b286 100644
--- a/docs/modules/Strong.ts.md
+++ b/docs/modules/Strong.ts.md
@@ -185,7 +185,7 @@ Added in v2.10.0
 
 ## ~~fanout~~
 
-Use `fanOut` instead.
+Use [`fanOut`](#fanout) instead.
 
 **Signature**
 
@@ -208,7 +208,7 @@ Added in v2.0.0
 
 ## ~~splitStrong~~
 
-Use `split` instead.
+Use [`split`](#split) instead.
 
 **Signature**
 
diff --git a/docs/modules/Task.ts.md b/docs/modules/Task.ts.md
index 9326fc79..36cdb9bf 100644
--- a/docs/modules/Task.ts.md
+++ b/docs/modules/Task.ts.md
@@ -466,7 +466,7 @@ Added in v2.0.0
 
 ## ~~getMonoid~~
 
-Use `Applicative.getApplicativeMonoid` instead.
+Use [`getApplicativeMonoid`](./Applicative.ts.html#getApplicativeMonoid) instead.
 
 Lift a monoid into 'Task', the inner values are concatenated using the provided `Monoid`.
 
@@ -480,7 +480,7 @@ Added in v2.0.0
 
 ## ~~getSemigroup~~
 
-Use `Apply.getApplySemigroup` instead.
+Use [`getApplySemigroup`](./Apply.ts.html#getApplySemigroup) instead.
 
 **Signature**
 
diff --git a/docs/modules/TaskEither.ts.md b/docs/modules/TaskEither.ts.md
index 3747d1ac..8b3c762c 100644
--- a/docs/modules/TaskEither.ts.md
+++ b/docs/modules/TaskEither.ts.md
@@ -147,7 +147,7 @@ types of kind `* -> *`.
 
 In case of `TaskEither` returns `fa` if is a `Right` or the value returned by `that` otherwise.
 
-See also [orElse](#orElse).
+See also [orElse](#orelse).
 
 **Signature**
 
@@ -200,7 +200,7 @@ Less strict version of [`alt`](#alt).
 ```ts
 export declare const altW: <E2, B>(
   that: Lazy<TaskEither<E2, B>>
-) => <E1, A>(fa: TaskEither<E1, A>) => TaskEither<E2 | E1, B | A>
+) => <E1, A>(fa: TaskEither<E1, A>) => TaskEither<E2, B | A>
 ```
 
 Added in v2.9.0
@@ -368,7 +368,7 @@ Added in v2.4.0
 
 ## chainEitherKW
 
-Less strict version of [`chainEitherK`](#chainEitherK).
+Less strict version of [`chainEitherK`](#chaineitherk).
 
 **Signature**
 
@@ -417,7 +417,7 @@ Added in v2.10.0
 
 ## chainFirstW
 
-Less strict version of [`chainFirst`](#chainFirst).
+Less strict version of [`chainFirst`](#chainfirst).
 
 Derivable from `Chain`.
 
@@ -445,7 +445,7 @@ Added in v2.4.0
 
 ## chainIOEitherKW
 
-Less strict version of [`chainIOEitherK`](#chainIOEitherK).
+Less strict version of [`chainIOEitherK`](#chainioeitherk).
 
 **Signature**
 
@@ -504,7 +504,7 @@ Added in v2.0.0
 
 ## filterOrElseW
 
-Less strict version of [`filterOrElse`](#filterOrElse).
+Less strict version of [`filterOrElse`](#filterorelse).
 
 **Signature**
 
@@ -633,7 +633,7 @@ Added in v2.0.0
 
 ## orElseW
 
-Less strict version of [`orElse`](#orElse).
+Less strict version of [`orElse`](#orelse).
 
 **Signature**
 
@@ -784,7 +784,7 @@ Added in v2.0.0
 
 ## fold
 
-Alias of [`matchE`](#matchE).
+Alias of [`matchE`](#matche).
 
 **Signature**
 
@@ -799,7 +799,7 @@ Added in v2.0.0
 
 ## foldW
 
-Alias of [`matchEW`](#matchEW).
+Alias of [`matchEW`](#matchew).
 
 **Signature**
 
@@ -824,7 +824,7 @@ Added in v2.0.0
 
 ## getOrElseW
 
-Less strict version of [`getOrElse`](#getOrElse).
+Less strict version of [`getOrElse`](#getorelse).
 
 **Signature**
 
@@ -859,7 +859,7 @@ Added in v2.10.0
 
 ## matchEW
 
-Less strict version of [`matchE`](#matchE).
+Less strict version of [`matchE`](#matche).
 
 **Signature**
 
@@ -1111,7 +1111,7 @@ Added in v2.1.0
 
 ## ~~getApplyMonoid~~
 
-Use `Applicative.getApplicativeMonoid` instead.
+Use [`getApplicativeMonoid`](./Applicative.ts.html#getApplicativeMonoid) instead.
 
 **Signature**
 
@@ -1123,10 +1123,7 @@ Added in v2.0.0
 
 ## ~~getApplySemigroup~~
 
-Use `Apply.getApplySemigroup` instead.
-
-Semigroup returning the left-most `Left` value. If both operands are `Right`s then the inner values
-are concatenated using the provided `Semigroup`
+Use [`getApplySemigroup`](./Apply.ts.html#getApplySemigroup) instead.
 
 **Signature**
 
@@ -1138,10 +1135,7 @@ Added in v2.0.0
 
 ## ~~getSemigroup~~
 
-Use `Apply.getApplySemigroup` instead.
-
-Semigroup returning the left-most non-`Left` value. If both operands are `Right`s then the inner values are
-concatenated using the provided `Semigroup`
+Use [`getApplySemigroup`](./Apply.ts.html#getApplySemigroup) instead.
 
 **Signature**
 
@@ -1153,7 +1147,7 @@ Added in v2.0.0
 
 ## ~~getTaskValidation~~
 
-Use `getApplicativeTaskValidation` and `getAltTaskValidation` instead.
+Use [`getApplicativeTaskValidation`](#getapplicativetaskvalidation) and [`getAltTaskValidation`](#getalttaskvalidation) instead.
 
 **Signature**
 
@@ -1215,7 +1209,7 @@ Transforms a `Promise` that may reject to a `Promise` that never rejects and ret
 
 Note: `f` should never `throw` errors, they are not caught.
 
-See also [`tryCatchK`](#tryCatchK).
+See also [`tryCatchK`](#trycatchk).
 
 **Signature**
 
diff --git a/docs/modules/TaskOption.ts.md b/docs/modules/TaskOption.ts.md
index 5f5e48df..d9dd4ac4 100644
--- a/docs/modules/TaskOption.ts.md
+++ b/docs/modules/TaskOption.ts.md
@@ -489,7 +489,7 @@ Added in v2.10.0
 
 ## fold
 
-Alias of [`matchE`](#matchE).
+Alias of [`matchE`](#matche).
 
 **Signature**
 
@@ -504,7 +504,7 @@ Added in v2.10.0
 
 ## foldW
 
-Alias of [`matchEW`](#matchEW).
+Alias of [`matchEW`](#matchew).
 
 **Signature**
 
@@ -529,7 +529,7 @@ Added in v2.10.0
 
 ## getOrElseW
 
-Less strict version of [`getOrElse`](#getOrElse).
+Less strict version of [`getOrElse`](#getorelse).
 
 **Signature**
 
@@ -564,7 +564,7 @@ Added in v2.10.0
 
 ## matchEW
 
-Less strict version of [`matchE`](#matchE).
+Less strict version of [`matchE`](#matche).
 
 **Signature**
 
@@ -803,7 +803,7 @@ Transforms a `Promise` that may reject to a `Promise` that never rejects and ret
 
 Note: `f` should never `throw` errors, they are not caught.
 
-See also [`tryCatchK`](#tryCatchK).
+See also [`tryCatchK`](#trycatchk).
 
 **Signature**
 
diff --git a/docs/modules/TaskThese.ts.md b/docs/modules/TaskThese.ts.md
index 2777d0c7..c3bb4c83 100644
--- a/docs/modules/TaskThese.ts.md
+++ b/docs/modules/TaskThese.ts.md
@@ -319,7 +319,7 @@ Added in v2.4.0
 
 ## fold
 
-Alias of [`matchE`](#matchE).
+Alias of [`matchE`](#matche).
 
 **Signature**
 
@@ -335,7 +335,7 @@ Added in v2.4.0
 
 ## foldW
 
-Alias of [`matchEW`](#matchEW).
+Alias of [`matchEW`](#matchew).
 
 **Signature**
 
@@ -379,7 +379,7 @@ Added in v2.10.0
 
 ## matchEW
 
-Less strict version of [`matchE`](#matchE).
+Less strict version of [`matchE`](#matche).
 
 **Signature**
 
@@ -533,7 +533,7 @@ Added in v2.4.0
 
 ## ~~bifunctorTaskThese~~
 
-Use `Bifunctor` instead.
+Use [`Bifunctor`](#bifunctor) instead.
 
 **Signature**
 
@@ -545,7 +545,7 @@ Added in v2.7.0
 
 ## ~~functorTaskThese~~
 
-Use `Functor` instead.
+Use [`Functor`](#functor) instead.
 
 **Signature**
 
@@ -557,7 +557,7 @@ Added in v2.7.0
 
 ## ~~getSemigroup~~
 
-Use `Apply.getApplySemigroup` instead.
+Use [`getApplySemigroup`](./Apply.ts.html#getApplySemigroup) instead.
 
 **Signature**
 
@@ -605,7 +605,7 @@ Added in v2.10.0
 
 ## ~~toTuple~~
 
-Use `toTuple2` instead.
+Use [`toTuple2`](#totuple2) instead.
 
 **Signature**
 
diff --git a/docs/modules/These.ts.md b/docs/modules/These.ts.md
index e10978f0..a014741c 100644
--- a/docs/modules/These.ts.md
+++ b/docs/modules/These.ts.md
@@ -339,7 +339,7 @@ Added in v2.0.0
 
 ## foldW
 
-Alias of [`matchW`](#matchW).
+Alias of [`matchW`](#matchw).
 
 **Signature**
 
@@ -765,7 +765,7 @@ Added in v2.6.3
 
 ## ~~toTuple~~
 
-Use `toTuple2` instead.
+Use [`toTuple2`](#totuple2) instead.
 
 **Signature**
 
diff --git a/docs/modules/Traced.ts.md b/docs/modules/Traced.ts.md
index 16ce9fc4..d2634b7d 100644
--- a/docs/modules/Traced.ts.md
+++ b/docs/modules/Traced.ts.md
@@ -105,7 +105,7 @@ Added in v2.0.0
 
 ## ~~traced~~
 
-Use `Functor` instead.
+Use [`Functor`](#functor) instead.
 
 **Signature**
 
diff --git a/docs/modules/Traversable.ts.md b/docs/modules/Traversable.ts.md
index 5ff28ba5..edf98b24 100644
--- a/docs/modules/Traversable.ts.md
+++ b/docs/modules/Traversable.ts.md
@@ -602,7 +602,12 @@ Added in v2.0.0
 
 ## ~~getTraversableComposition~~
 
-Returns the composition of two traversables
+Use
+
+- [`traverse`](#traverse)
+- [`sequence`](#sequence)
+
+instead.
 
 **Signature**
 
diff --git a/docs/modules/Tuple.ts.md b/docs/modules/Tuple.ts.md
index dafc724c..c978e217 100644
--- a/docs/modules/Tuple.ts.md
+++ b/docs/modules/Tuple.ts.md
@@ -399,7 +399,7 @@ Added in v2.6.3
 
 ## ~~mapLeft~~
 
-Use `mapSnd` instead.
+Use [`mapSnd`](#mapsnd) instead.
 
 **Signature**
 
@@ -411,7 +411,7 @@ Added in v2.0.0
 
 ## ~~map~~
 
-Use `mapFst` instead.
+Use [`mapFst`](#mapfst) instead.
 
 **Signature**
 
diff --git a/docs/modules/Writer.ts.md b/docs/modules/Writer.ts.md
index d15d11bb..76569fdb 100644
--- a/docs/modules/Writer.ts.md
+++ b/docs/modules/Writer.ts.md
@@ -214,7 +214,7 @@ Added in v2.10.0
 
 ## ~~writer~~
 
-Use `Functor` instead.
+Use [`Functor`](#functor) instead.
 
 **Signature**
 
@@ -262,7 +262,7 @@ Added in v2.8.0
 
 ## ~~evalWriter~~
 
-Use `evaluate` instead
+Use [`evaluate`](#evaluate) instead
 
 **Signature**
 
@@ -274,7 +274,7 @@ Added in v2.0.0
 
 ## ~~execWriter~~
 
-Use `execute` instead
+Use [`execute`](#execute) instead
 
 **Signature**
 
diff --git a/docs/modules/boolean.ts.md b/docs/modules/boolean.ts.md
index a59401e8..af55cd2c 100644
--- a/docs/modules/boolean.ts.md
+++ b/docs/modules/boolean.ts.md
@@ -45,7 +45,7 @@ Added in v2.2.0
 
 ## foldW
 
-Alias of [`matchW`](#matchW).
+Alias of [`matchW`](#matchw).
 
 **Signature**
 
diff --git a/package.json b/package.json
index 80116f0d..ac6069ba 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "fp-ts",
-  "version": "2.10.0-rc.8",
+  "version": "2.10.4",
   "description": "Functional programming in TypeScript",
   "main": "lib/index.js",
   "module": "es6/index.js",
@@ -18,7 +18,6 @@
     "build": "tsc -p ./tsconfig.build.json && tsc -p ./tsconfig.build-es6.json && ts-node scripts/build",
     "postbuild": "prettier --loglevel=silent --write \"./dist/**/*.ts\"",
     "prepublishOnly": "ts-node scripts/pre-publish",
-    "doctoc": "doctoc README.md docs/introduction/code-conventions.md --title \"**Table of contents**\"",
     "mocha": "mocha -r ts-node/register test/*.ts",
     "dtslint": "dtslint dtslint",
     "docs": "docs-ts",
@@ -43,7 +42,6 @@
     "@types/prettier": "1.10.0",
     "benchmark": "2.1.4",
     "docs-ts": "^0.6.7",
-    "doctoc": "^1.4.0",
     "dtslint": "github:gcanti/dtslint",
     "fast-check": "^1.25.1",
     "glob": "^7.1.6",
diff --git a/scripts/release.ts b/scripts/release.ts
index c9a17790..0554df72 100644
--- a/scripts/release.ts
+++ b/scripts/release.ts
@@ -16,7 +16,7 @@ const exec = (cmd: string, args?: child_process.ExecOptions): TE.TaskEither<Erro
     })
   })
 
-export const main = exec('npm publish --tag=rc', {
+export const main = exec('npm publish', {
   cwd: DIST
 })
 
diff --git a/src/Applicative.ts b/src/Applicative.ts
index 1496c07f..debd3c90 100644
--- a/src/Applicative.ts
+++ b/src/Applicative.ts
@@ -235,7 +235,7 @@ export interface ApplicativeComposition22C<F extends URIS2, G extends URIS2, E>
 }
 
 /**
- * Like `Functor`, `Applicative`s compose. If `F` and `G` have `Applicative` instances, then so does `F<G<_>>`
+ * Use [`ap`](./Apply.ts.html#ap) instead.
  *
  * @since 2.0.0
  * @deprecated
diff --git a/src/Array.ts b/src/Array.ts
index cd714335..ee1b34d4 100644
--- a/src/Array.ts
+++ b/src/Array.ts
@@ -133,7 +133,7 @@ export const matchLeft = <B, A>(onEmpty: Lazy<B>, onNonEmpty: (head: A, tail: Ar
   isNonEmpty(as) ? onNonEmpty(NEA.head(as), NEA.tail(as)) : onEmpty()
 
 /**
- * Alias of [`matchLeft`](#matchLeft).
+ * Alias of [`matchLeft`](#matchleft).
  *
  * @category destructors
  * @since 2.0.0
@@ -153,7 +153,7 @@ export const matchRight = <B, A>(onEmpty: Lazy<B>, onNonEmpty: (init: Array<A>,
   isNonEmpty(as) ? onNonEmpty(NEA.init(as), NEA.last(as)) : onEmpty()
 
 /**
- * Alias of [`matchRight`](#matchRight).
+ * Alias of [`matchRight`](#matchright).
  *
  * @category destructors
  * @since 2.0.0
diff --git a/src/BooleanAlgebra.ts b/src/BooleanAlgebra.ts
index 45538e94..ff30e017 100644
--- a/src/BooleanAlgebra.ts
+++ b/src/BooleanAlgebra.ts
@@ -64,7 +64,7 @@ export const booleanAlgebraVoid: BooleanAlgebra<void> = {
 // -------------------------------------------------------------------------------------
 
 /**
- * Use `reverse` instead.
+ * Use [`reverse`](#reverse) instead.
  *
  * @category combinators
  * @since 2.0.0
@@ -73,7 +73,7 @@ export const booleanAlgebraVoid: BooleanAlgebra<void> = {
 export const getDualBooleanAlgebra = reverse
 
 /**
- * Use `boolean.BooleanAlgebra` instead.
+ * Use [`BooleanAlgebra`](./boolean.ts.html#BooleanAlgebra) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -89,7 +89,7 @@ export const booleanAlgebraBoolean: BooleanAlgebra<boolean> = {
 }
 
 /**
- * Use `function.getBooleanAlgebra` instead
+ * Use [`getBooleanAlgebra`](./function.ts.html#getBooleanAlgebra) instead.
  *
  * @category instances
  * @since 2.0.0
diff --git a/src/Bounded.ts b/src/Bounded.ts
index f1edaf40..79d97ca8 100644
--- a/src/Bounded.ts
+++ b/src/Bounded.ts
@@ -27,7 +27,7 @@ export interface Bounded<A> extends Ord<A> {
 // -------------------------------------------------------------------------------------
 
 /**
- * Use `number.Bounded` instead.
+ * Use [`Bounded`](./number.ts.html#Bounded) instead.
  *
  * @category instances
  * @since 2.0.0
diff --git a/src/Choice.ts b/src/Choice.ts
index 9f1450e5..d5aaaea5 100644
--- a/src/Choice.ts
+++ b/src/Choice.ts
@@ -171,7 +171,7 @@ export function fanIn<P>(
 // -------------------------------------------------------------------------------------
 
 /**
- * Use `split` instead.
+ * Use [`split`](#split) instead.
  *
  * @since 2.0.0
  * @deprecated
@@ -194,7 +194,7 @@ export function splitChoice<F>(
 }
 
 /**
- * Use `fanIn` instead.
+ * Use [`fanIn`](#fanIn) instead.
  *
  * @since 2.0.0
  * @deprecated
diff --git a/src/Compactable.ts b/src/Compactable.ts
index 7fc5a837..28fcc0dd 100644
--- a/src/Compactable.ts
+++ b/src/Compactable.ts
@@ -309,6 +309,8 @@ export interface CompactableComposition23C<F extends URIS2, G extends URIS3, E>
 }
 
 /**
+ * Use [`compact`](#compact) and [`separate`](#separate) instead.
+ *
  * @since 2.0.0
  * @deprecated
  */
@@ -370,7 +372,7 @@ export function getCompactableComposition<F, G>(
 }
 
 /**
- * Use `Separated.Separated` instead.
+ * Use [`Separated`](./Separated.ts.html#Separated) instead.
  *
  * @since 2.0.0
  * @deprecated
diff --git a/src/Either.ts b/src/Either.ts
index f112ffbe..1749804a 100644
--- a/src/Either.ts
+++ b/src/Either.ts
@@ -191,7 +191,7 @@ export const matchW = <E, B, A, C>(onLeft: (e: E) => B, onRight: (a: A) => C) =>
   isLeft(ma) ? onLeft(ma.left) : onRight(ma.right)
 
 /**
- * Alias of [`matchW`](#matchW).
+ * Alias of [`matchW`](#matchww).
  *
  * @category destructors
  * @since 2.10.0
@@ -243,7 +243,7 @@ export const match: <E, A, B>(onLeft: (e: E) => B, onRight: (a: A) => B) => (ma:
 export const fold: <E, A, B>(onLeft: (e: E) => B, onRight: (a: A) => B) => (ma: Either<E, A>) => B = match
 
 /**
- * Less strict version of [`getOrElse`](#getOrElse).
+ * Less strict version of [`getOrElse`](#getorelse).
  *
  * @category destructors
  * @since 2.6.0
@@ -304,7 +304,7 @@ export const fromNullable = <E>(e: E) => <A>(a: A): Either<E, NonNullable<A>> =>
 /**
  * Constructs a new `Either` from a function that might throw.
  *
- * See also [`tryCatchK`](#tryCatchK).
+ * See also [`tryCatchK`](#trycatchk).
  *
  * @example
  * import * as E from 'fp-ts/Either'
@@ -414,7 +414,7 @@ export function swap<E, A>(ma: Either<E, A>): Either<A, E> {
 }
 
 /**
- * Less strict version of [`orElse`](#orElse).
+ * Less strict version of [`orElse`](#orelse).
  *
  * @category combinators
  * @since 2.10.0
@@ -431,7 +431,7 @@ export const orElseW = <E1, E2, B>(onLeft: (e: E1) => Either<E2, B>) => <A>(ma:
 export const orElse: <E1, A, E2>(onLeft: (e: E1) => Either<E2, A>) => (ma: Either<E1, A>) => Either<E2, A> = orElseW
 
 /**
- * Less strict version of [`filterOrElse`](#filterOrElse).
+ * Less strict version of [`filterOrElse`](#filterorelse).
  *
  * @category combinators
  * @since 2.9.0
@@ -621,9 +621,9 @@ export const flatten: <E, A>(mma: Either<E, Either<E, A>>) => Either<E, A> =
  * @category Alt
  * @since 2.9.0
  */
-export const altW: <E2, B>(that: Lazy<Either<E2, B>>) => <E1, A>(fa: Either<E1, A>) => Either<E1 | E2, A | B> = (
-  that
-) => (fa) => (isLeft(fa) ? that() : fa)
+export const altW: <E2, B>(that: Lazy<Either<E2, B>>) => <E1, A>(fa: Either<E1, A>) => Either<E2, A | B> = (that) => (
+  fa
+) => (isLeft(fa) ? that() : fa)
 
 /**
  * Identifies an associative operation on a type constructor. It is similar to `Semigroup`, except that it applies to
@@ -1118,7 +1118,7 @@ export const chainFirst: <E, A, B>(f: (a: A) => Either<E, B>) => (ma: Either<E,
   chainFirst_(Chain)
 
 /**
- * Less strict version of [`chainFirst`](#chainFirst)
+ * Less strict version of [`chainFirst`](#chainfirst)
  *
  * Derivable from `Chain`.
  *
@@ -1358,7 +1358,7 @@ export const sequenceArray: <E, A>(as: ReadonlyArray<Either<E, A>>) => Either<E,
 // -------------------------------------------------------------------------------------
 
 /**
- * Use the `Json` module instead.
+ * Use [`Json`](./Json.ts.html) module instead.
  *
  * @since 2.6.7
  * @deprecated
@@ -1367,7 +1367,7 @@ export const sequenceArray: <E, A>(as: ReadonlyArray<Either<E, A>>) => Either<E,
 export type Json = boolean | number | string | null | JsonArray | JsonRecord
 
 /**
- * Use the `Json` module instead.
+ * Use [`Json`](./Json.ts.html) module instead.
  *
  * @since 2.6.7
  * @deprecated
@@ -1378,7 +1378,7 @@ export interface JsonRecord {
 }
 
 /**
- * Use the `Json` module instead.
+ * Use [`Json`](./Json.ts.html) module instead.
  *
  * @since 2.6.7
  * @deprecated
@@ -1387,7 +1387,7 @@ export interface JsonRecord {
 export interface JsonArray extends ReadonlyArray<Json> {}
 
 /**
- * Use the `Json.parse` module instead.
+ * Use [`parse`](./Json.ts.html#parse) instead.
  *
  * @category constructors
  * @since 2.0.0
@@ -1399,7 +1399,7 @@ export function parseJSON<E>(s: string, onError: (reason: unknown) => E): Either
 }
 
 /**
- * Use the `Json.stringify` module instead.
+ * Use [`stringify`](./Json.ts.html#stringify) instead.
  *
  * @category constructors
  * @since 2.0.0
@@ -1448,7 +1448,7 @@ export const either: Monad2<URI> &
 }
 
 /**
- * Use `Apply.getApplySemigroup` instead.
+ * Use [`getApplySemigroup`](./Apply.ts.html#getApplySemigroup) instead.
  *
  * Semigroup returning the left-most `Left` value. If both operands are `Right`s then the inner values
  * are concatenated using the provided `Semigroup`
@@ -1462,7 +1462,7 @@ export const getApplySemigroup: <E, A>(S: Semigroup<A>) => Semigroup<Either<E, A
   getApplySemigroup_(Apply)
 
 /**
- * Use `Applicative.getApplicativeMonoid` instead.
+ * Use [`getApplicativeMonoid`](./Applicative.ts.html#getApplicativeMonoid) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -1473,7 +1473,7 @@ export const getApplyMonoid: <E, A>(M: Monoid<A>) => Monoid<Either<E, A>> =
   getApplicativeMonoid(Applicative)
 
 /**
- * Use `Apply.getApplySemigroup` instead.
+ * Use [`getApplySemigroup`](./Apply.ts.html#getApplySemigroup) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -1483,7 +1483,7 @@ export const getValidationSemigroup = <E, A>(SE: Semigroup<E>, SA: Semigroup<A>)
   getApplySemigroup_(getApplicativeValidation(SE))(SA)
 
 /**
- * Use `Applicative.getApplicativeMonoid` instead.
+ * Use [`getApplicativeMonoid`](./Applicative.ts.html#getApplicativeMonoid) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -1493,7 +1493,7 @@ export const getValidationMonoid = <E, A>(SE: Semigroup<E>, MA: Monoid<A>): Mono
   getApplicativeMonoid(getApplicativeValidation(SE))(MA)
 
 /**
- * Use `getApplicativeValidation` and `getAltValidation` instead.
+ * Use [`getApplicativeValidation`](#getapplicativevalidation) and [`getAltValidation`](#getaltvalidation) instead.
  *
  * @category instances
  * @since 2.0.0
diff --git a/src/Eq.ts b/src/Eq.ts
index 3e19b8c6..b7734bd4 100644
--- a/src/Eq.ts
+++ b/src/Eq.ts
@@ -163,7 +163,7 @@ export const Contravariant: Contravariant1<URI> = {
 // -------------------------------------------------------------------------------------
 
 /**
- * Use `tuple` instead.
+ * Use [`tuple`](#tuple) instead.
  *
  * @category combinators
  * @since 2.0.0
@@ -174,7 +174,7 @@ export const getTupleEq: <T extends ReadonlyArray<Eq<any>>>(
 ) => Eq<{ [K in keyof T]: T[K] extends Eq<infer A> ? A : never }> = tuple
 
 /**
- * Use `struct` instead.
+ * Use [`struct`](#struct) instead.
  *
  * @category combinators
  * @since 2.0.0
@@ -183,7 +183,7 @@ export const getTupleEq: <T extends ReadonlyArray<Eq<any>>>(
 export const getStructEq: <O extends ReadonlyRecord<string, any>>(eqs: { [K in keyof O]: Eq<O[K]> }) => Eq<O> = struct
 
 /**
- * Use `eqStrict` instead
+ * Use [`eqStrict`](#eqstrict) instead
  *
  * @since 2.0.0
  * @deprecated
@@ -200,7 +200,7 @@ export const strictEqual: <A>(a: A, b: A) => boolean = eqStrict.equals
 export const eq: Contravariant1<URI> = Contravariant
 
 /**
- * Use `boolean.Eq` instead.
+ * Use [`Eq`](./boolean.ts.html#Eq) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -209,7 +209,7 @@ export const eq: Contravariant1<URI> = Contravariant
 export const eqBoolean: Eq<boolean> = eqStrict
 
 /**
- * Use `string.Eq` instead.
+ * Use [`Eq`](./string.ts.html#Eq) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -218,7 +218,7 @@ export const eqBoolean: Eq<boolean> = eqStrict
 export const eqString: Eq<string> = eqStrict
 
 /**
- * Use `number.Eq` instead.
+ * Use [`Eq`](./number.ts.html#Eq) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -227,7 +227,7 @@ export const eqString: Eq<string> = eqStrict
 export const eqNumber: Eq<number> = eqStrict
 
 /**
- * Use `Date.Eq` instead.
+ * Use [`Eq`](./Date.ts.html#Eq) instead.
  *
  * @category instances
  * @since 2.0.0
diff --git a/src/Field.ts b/src/Field.ts
index 24ec5e79..a3a33914 100644
--- a/src/Field.ts
+++ b/src/Field.ts
@@ -51,6 +51,8 @@ export function lcm<A>(E: Eq<A>, F: Field<A>): (x: A, y: A) => A {
 // -------------------------------------------------------------------------------------
 
 /**
+ * Use [`Field`](./number.ts.html#Field) instead.
+ *
  * @category instances
  * @since 2.0.0
  * @deprecated
diff --git a/src/Filterable.ts b/src/Filterable.ts
index 65060154..7642f788 100644
--- a/src/Filterable.ts
+++ b/src/Filterable.ts
@@ -615,6 +615,15 @@ export interface FilterableComposition23C<F extends URIS2, G extends URIS3, E>
 }
 
 /**
+ * Use
+ *
+ * - [`filter`](#filter)
+ * - [`filterMap`](#filtermap)
+ * - [`partition`](#partition)
+ * - [`partitionMap`](#partitionmap)
+ *
+ * instead.
+ *
  * @since 2.0.0
  * @deprecated
  */
diff --git a/src/Foldable.ts b/src/Foldable.ts
index ef4794e3..f6f1f9bb 100644
--- a/src/Foldable.ts
+++ b/src/Foldable.ts
@@ -329,7 +329,7 @@ export function traverse_<M, F>(
 // tslint:disable: deprecation
 
 /**
- * Use `reduceM` instead
+ * Use [`reduceM`](#reducem) instead
  *
  * @since 2.0.0
  * @deprecated
@@ -371,7 +371,7 @@ export function foldM<M, F>(
 }
 
 /**
- * Use `toReadonlyArray` instead
+ * Use [`toReadonlyArray`](#toreadonlyarray) instead
  *
  * @since 2.8.0
  * @deprecated
@@ -459,7 +459,13 @@ export interface FoldableComposition22C<F extends URIS2, G extends URIS2, E> {
 }
 
 /**
- * Returns the composition of two foldables
+ * Use
+ *
+ * - [reduce](#reduce)
+ * - [foldMap](#foldmap)
+ * - [reduceRight](#reduceright)
+ *
+ * instead.
  *
  * @since 2.0.0
  * @deprecated
diff --git a/src/FoldableWithIndex.ts b/src/FoldableWithIndex.ts
index 32bf9c69..35099ccf 100644
--- a/src/FoldableWithIndex.ts
+++ b/src/FoldableWithIndex.ts
@@ -291,6 +291,14 @@ export interface FoldableWithIndexComposition22C<F extends URIS2, FI, G extends
 }
 
 /**
+ * Use
+ *
+ * - [reduceWithIndex](#reducewithindex)
+ * - [foldMapWithIndex](#foldmapwithindex)
+ * - [reduceRightWithIndex](#reducerightwithindex)
+ *
+ * instead.
+ *
  * @since 2.0.0
  * @deprecated
  */
diff --git a/src/Functor.ts b/src/Functor.ts
index d3b2acb7..2aa7cfd1 100644
--- a/src/Functor.ts
+++ b/src/Functor.ts
@@ -276,6 +276,8 @@ export interface FunctorComposition23C<F extends URIS2, G extends URIS3, E> {
 }
 
 /**
+ * Use [`map`](#map) instead.
+ *
  * @since 2.0.0
  * @deprecated
  */
diff --git a/src/FunctorWithIndex.ts b/src/FunctorWithIndex.ts
index 62d952b8..015640f5 100644
--- a/src/FunctorWithIndex.ts
+++ b/src/FunctorWithIndex.ts
@@ -201,6 +201,8 @@ export interface FunctorWithIndexComposition22C<F extends URIS2, FI, G extends U
 }
 
 /**
+ * Use [`mapWithIndex`](#mapwithindex) instead.
+ *
  * @since 2.0.0
  * @deprecated
  */
diff --git a/src/IO.ts b/src/IO.ts
index 601d12c4..491a69f7 100644
--- a/src/IO.ts
+++ b/src/IO.ts
@@ -356,7 +356,7 @@ export const io: Monad1<URI> & MonadIO1<URI> & ChainRec1<URI> = {
 }
 
 /**
- * Use `Apply.getApplySemigroup` instead.
+ * Use [`getApplySemigroup`](./Apply.ts.html#getApplySemigroup) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -367,7 +367,7 @@ export const getSemigroup: <A>(S: Semigroup<A>) => Semigroup<IO<A>> =
   getApplySemigroup(Apply)
 
 /**
- * Use `Applicative.getApplicativeMonoid` instead.
+ * Use [`getApplicativeMonoid`](./Applicative.ts.html#getApplicativeMonoid) instead.
  *
  * @category instances
  * @since 2.0.0
diff --git a/src/IOEither.ts b/src/IOEither.ts
index 6555cf19..417bbb62 100644
--- a/src/IOEither.ts
+++ b/src/IOEither.ts
@@ -141,7 +141,7 @@ export const matchE: <E, A, B>(onLeft: (e: E) => IO<B>, onRight: (a: A) => IO<B>
   ET.matchE(I.Monad)
 
 /**
- * Alias of [`matchE`](#matchE).
+ * Alias of [`matchE`](#matche).
  *
  * @category destructors
  * @since 2.0.0
@@ -149,7 +149,7 @@ export const matchE: <E, A, B>(onLeft: (e: E) => IO<B>, onRight: (a: A) => IO<B>
 export const fold = matchE
 
 /**
- * Less strict version of [`matchE`](#matchE).
+ * Less strict version of [`matchE`](#matche).
  *
  * @category destructors
  * @since 2.10.0
@@ -160,7 +160,7 @@ export const matchEW: <E, B, A, C>(
 ) => (ma: IOEither<E, A>) => IO<B | C> = matchE as any
 
 /**
- * Alias of [`matchEW`](#matchEW).
+ * Alias of [`matchEW`](#matchew).
  *
  * @category destructors
  * @since 2.10.0
@@ -176,7 +176,7 @@ export const getOrElse: <E, A>(onLeft: (e: E) => IO<A>) => (ma: IOEither<E, A>)
   ET.getOrElse(I.Monad)
 
 /**
- * Less strict version of [`getOrElse`](#getOrElse).
+ * Less strict version of [`getOrElse`](#getorelse).
  *
  * @category destructors
  * @since 2.6.0
@@ -190,7 +190,7 @@ export const getOrElseW: <E, B>(onLeft: (e: E) => IO<B>) => <A>(ma: IOEither<E,
 /**
  * Constructs a new `IOEither` from a function that performs a side effect and might throw
  *
- * See also [`tryCatchK`](#tryCatchK).
+ * See also [`tryCatchK`](#trycatchk).
  *
  * @category interop
  * @since 2.0.0
@@ -230,7 +230,7 @@ export const orElse: <E1, A, E2>(onLeft: (e: E1) => IOEither<E2, A>) => (ma: IOE
   ET.orElse(I.Monad)
 
 /**
- * Less strict version of [`orElse`](#orElse).
+ * Less strict version of [`orElse`](#orelse).
  *
  * @category combinators
  * @since 2.10.0
@@ -379,7 +379,7 @@ export const alt: <E, A>(that: Lazy<IOEither<E, A>>) => (fa: IOEither<E, A>) =>
  */
 export const altW: <E2, B>(
   that: Lazy<IOEither<E2, B>>
-) => <E1, A>(fa: IOEither<E1, A>) => IOEither<E1 | E2, A | B> = alt as any
+) => <E1, A>(fa: IOEither<E1, A>) => IOEither<E2, A | B> = alt as any
 
 /**
  * @category MonadThrow
@@ -608,7 +608,7 @@ export const chainFirst: <E, A, B>(f: (a: A) => IOEither<E, B>) => (ma: IOEither
   chainFirst_(Chain)
 
 /**
- * Less strict version of [`chainFirst`](#chainFirst).
+ * Less strict version of [`chainFirst`](#chainfirst).
  *
  * Derivable from `Chain`.
  *
@@ -730,7 +730,7 @@ export const chainEitherK: <E, A, B>(f: (a: A) => E.Either<E, B>) => (ma: IOEith
   chainEitherK_(FromEither, Chain)
 
 /**
- * Less strict version of [`chainEitherK`](#chainEitherK).
+ * Less strict version of [`chainEitherK`](#chaineitherk).
  *
  * @category combinators
  * @since 2.6.1
@@ -762,7 +762,7 @@ export const filterOrElse: {
   filterOrElse_(FromEither, Chain)
 
 /**
- * Less strict version of [`filterOrElse`](#filterOrElse).
+ * Less strict version of [`filterOrElse`](#filterorelse).
  *
  * @category combinators
  * @since 2.9.0
@@ -946,7 +946,7 @@ export const sequenceSeqArray: <E, A>(arr: ReadonlyArray<IOEither<E, A>>) => IOE
 // -------------------------------------------------------------------------------------
 
 /**
- * Use `ApplicativePar` instead
+ * Use [`ApplicativePar`](#applicativepar) instead
  *
  * @since 2.7.0
  * @category instances
@@ -979,10 +979,7 @@ export const ioEither: Monad2<URI> & Bifunctor2<URI> & Alt2<URI> & MonadIO2<URI>
 }
 
 /**
- * Use `Apply.getApplySemigroup` instead.
- *
- * Semigroup returning the left-most `Left` value. If both operands are `Right`s then the inner values
- * are concatenated using the provided `Semigroup`
+ * Use [`getApplySemigroup`](./Apply.ts.html#getApplySemigroup) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -993,7 +990,7 @@ export const getApplySemigroup: <E, A>(S: Semigroup<A>) => Semigroup<IOEither<E,
   getApplySemigroup_(ApplyPar)
 
 /**
- * Use `Applicative.getApplicativeMonoid` instead.
+ * Use [`getApplicativeMonoid`](./Applicative.ts.html#getApplicativeMonoid) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -1004,10 +1001,7 @@ export const getApplyMonoid: <E, A>(M: Monoid<A>) => Monoid<IOEither<E, A>> =
   getApplicativeMonoid(ApplicativePar)
 
 /**
- * Use `Apply.getApplySemigroup` instead.
- *
- * Semigroup returning the left-most non-`Left` value. If both operands are `Right`s then the inner values are
- * concatenated using the provided `Semigroup`
+ * Use [`getApplySemigroup`](./Apply.ts.html#getApplySemigroup) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -1017,7 +1011,7 @@ export const getSemigroup = <E, A>(S: Semigroup<A>): Semigroup<IOEither<E, A>> =
   getApplySemigroup_(I.Apply)(E.getSemigroup(S))
 
 /**
- * Use `getApplicativeIOValidation` and `getAltIOValidation`.
+ * Use [`getApplicativeIOValidation`](#getapplicativeiovalidation) and [`getAltIOValidation`](#getaltiovalidation).
  *
  * @category instances
  * @since 2.0.0
diff --git a/src/Map.ts b/src/Map.ts
index 9b4d6e88..2cd6430b 100644
--- a/src/Map.ts
+++ b/src/Map.ts
@@ -817,7 +817,7 @@ export const Filterable: Filterable2<URI> = {
 export const empty = new Map<never, never>()
 
 /**
- * Use `upsertAt` instead.
+ * Use [`upsertAt`](#upsertat) instead.
  *
  * @category combinators
  * @since 2.0.0
@@ -826,7 +826,7 @@ export const empty = new Map<never, never>()
 export const insertAt: <K>(E: Eq<K>) => <A>(k: K, a: A) => (m: Map<K, A>) => Map<K, A> = upsertAt
 
 /**
- * Use `Filterable` instead.
+ * Use [`Filterable`](#filterable) instead.
  *
  * @category instances
  * @since 2.0.0
diff --git a/src/Monoid.ts b/src/Monoid.ts
index 3a593329..120a2002 100644
--- a/src/Monoid.ts
+++ b/src/Monoid.ts
@@ -141,7 +141,7 @@ export const reverse = <A>(M: Monoid<A>): Monoid<A> => ({
 export const struct = <A>(monoids: { [K in keyof A]: Monoid<A[K]> }): Monoid<{ readonly [K in keyof A]: A[K] }> => {
   const empty: A = {} as any
   for (const k in monoids) {
-    if (_.hasOwnProperty.call(monoids, k)) {
+    if (_.has.call(monoids, k)) {
       empty[k] = monoids[k].empty
     }
   }
@@ -211,7 +211,7 @@ export const concatAll = <A>(M: Monoid<A>): ((as: ReadonlyArray<A>) => A) => Se.
 // -------------------------------------------------------------------------------------
 
 /**
- * Use `tuple` instead.
+ * Use [`tuple`](#tuple) instead.
  *
  * @category combinators
  * @since 2.0.0
@@ -222,7 +222,7 @@ export const getTupleMonoid: <T extends ReadonlyArray<Monoid<any>>>(
 ) => Monoid<{ [K in keyof T]: T[K] extends Se.Semigroup<infer A> ? A : never }> = tuple as any
 
 /**
- * Use `struct` instead.
+ * Use [`struct`](#struct) instead.
  *
  * @category combinators
  * @since 2.0.0
@@ -233,7 +233,7 @@ export const getStructMonoid: <O extends ReadonlyRecord<string, any>>(
 ) => Monoid<O> = struct
 
 /**
- * Use `reverse` instead.
+ * Use [`reverse`](#reverse) instead.
  *
  * @category combinators
  * @since 2.0.0
@@ -242,7 +242,7 @@ export const getStructMonoid: <O extends ReadonlyRecord<string, any>>(
 export const getDualMonoid = reverse
 
 /**
- * Use `max` instead.
+ * Use [`max`](#max) instead.
  *
  * @category constructors
  * @since 2.0.0
@@ -251,7 +251,7 @@ export const getDualMonoid = reverse
 export const getJoinMonoid = max
 
 /**
- * Use `min` instead.
+ * Use [`min`](#min) instead.
  *
  * @category constructors
  * @since 2.0.0
@@ -260,7 +260,7 @@ export const getJoinMonoid = max
 export const getMeetMonoid = min
 
 /**
- * Use `concatAll` instead.
+ * Use [`concatAll`](#concatall) instead.
  *
  * @since 2.0.0
  * @deprecated
@@ -268,7 +268,7 @@ export const getMeetMonoid = min
 export const fold = concatAll
 
 /**
- * Use `boolean.MonoidAll` instead.
+ * Use [`MonoidAll`](./boolean.ts.html#monoidall) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -281,7 +281,7 @@ export const monoidAll: Monoid<boolean> = {
 }
 
 /**
- * Use `boolean.MonoidAny` instead.
+ * Use [`MonoidAny`](./boolean.ts.html#MonoidAny) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -294,7 +294,7 @@ export const monoidAny: Monoid<boolean> = {
 }
 
 /**
- * Use `function.getMonoid` instead.
+ * Use [`getMonoid`](./function.ts.html#getMonoid) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -303,9 +303,9 @@ export const monoidAny: Monoid<boolean> = {
 export const getFunctionMonoid: <M>(M: Monoid<M>) => <A = never>() => Monoid<(a: A) => M> = getMonoid
 
 /**
- * Use `function.getEndomorphismMonoid` instead.
+ * Use [`getEndomorphismMonoid`](./function.ts.html#getEndomorphismMonoid) instead.
  *
- * **Note**. The execution order in `function.getEndomorphismMonoid` is reversed.
+ * **Note**. The execution order in [`getEndomorphismMonoid`](./function.ts.html#getEndomorphismMonoid) is reversed.
  *
  * @category instances
  * @since 2.0.0
@@ -314,7 +314,7 @@ export const getFunctionMonoid: <M>(M: Monoid<M>) => <A = never>() => Monoid<(a:
 export const getEndomorphismMonoid = <A = never>(): Monoid<Endomorphism<A>> => reverse(getEM())
 
 /**
- * Use `string.Monoid` instead.
+ * Use [`Monoid`](./string.ts.html#Monoid) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -327,7 +327,7 @@ export const monoidString: Monoid<string> = {
 }
 
 /**
- * Use `number.MonoidSum` instead.
+ * Use [`MonoidSum`](./number.ts.html#MonoidSum) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -340,6 +340,8 @@ export const monoidSum: Monoid<number> = {
 }
 
 /**
+ * Use [`MonoidProduct`](./number.ts.html#MonoidProduct) instead.
+ *
  * @category instances
  * @since 2.0.0
  * @deprecated
diff --git a/src/NonEmptyArray.ts b/src/NonEmptyArray.ts
index c78720b4..a4f44570 100644
--- a/src/NonEmptyArray.ts
+++ b/src/NonEmptyArray.ts
@@ -1061,7 +1061,7 @@ export const concatAll = <A>(S: Semigroup<A>) => (as: NonEmptyArray<A>): A => as
 // -------------------------------------------------------------------------------------
 
 /**
- * Use `Array`'s `filter` instead.
+ * Use [`filter`](./Array.ts.html#filter) instead.
  *
  * @category combinators
  * @since 2.0.0
@@ -1075,7 +1075,7 @@ export function filter<A>(predicate: Predicate<A>): (as: NonEmptyArray<A>) => Op
 }
 
 /**
- * Use `Array`'s `filterWithIndex` instead.
+ * Use [`filterWithIndex`](./Array.ts.html#filterWithIndex) instead.
  *
  * @category combinators
  * @since 2.0.0
@@ -1086,7 +1086,7 @@ export const filterWithIndex = <A>(predicate: (i: number, a: A) => boolean) => (
 ): Option<NonEmptyArray<A>> => fromArray(as.filter((a, i) => predicate(i, a)))
 
 /**
- * Use `unprepend` instead.
+ * Use [`unprepend`](#unprepend) instead.
  *
  * @category destructors
  * @since 2.9.0
@@ -1095,7 +1095,7 @@ export const filterWithIndex = <A>(predicate: (i: number, a: A) => boolean) => (
 export const uncons: <A>(as: NonEmptyArray<A>) => [A, Array<A>] = unprepend
 
 /**
- * Use `unappend` instead.
+ * Use [`unappend`](#unappend) instead.
  *
  * @category destructors
  * @since 2.9.0
@@ -1104,7 +1104,7 @@ export const uncons: <A>(as: NonEmptyArray<A>) => [A, Array<A>] = unprepend
 export const unsnoc: <A>(as: NonEmptyArray<A>) => [Array<A>, A] = unappend
 
 /**
- * Use `Array`'s `prepend` instead.
+ * Use [`prepend`](./Array.ts.html#prepend) instead.
  *
  * @category constructors
  * @since 2.0.0
@@ -1118,7 +1118,7 @@ export function cons<A>(head: A, tail?: Array<A>): NonEmptyArray<A> | ((tail: Ar
 }
 
 /**
- * Use `Array`'s `append` instead.
+ * Use [`append`](./Array.ts.html#append) instead.
  *
  * @category constructors
  * @since 2.0.0
@@ -1127,7 +1127,7 @@ export function cons<A>(head: A, tail?: Array<A>): NonEmptyArray<A> | ((tail: Ar
 export const snoc = <A>(init: Array<A>, end: A): NonEmptyArray<A> => pipe(init, append(end))
 
 /**
- * Use `prependAll` instead.
+ * Use [`prependAll`](#prependall) instead.
  *
  * @category combinators
  * @since 2.9.0
@@ -1136,7 +1136,7 @@ export const snoc = <A>(init: Array<A>, end: A): NonEmptyArray<A> => pipe(init,
 export const prependToAll = prependAll
 
 /**
- * Use `concatAll` instead.
+ * Use [`concatAll`](#concatall) instead.
  *
  * @since 2.5.0
  * @deprecated
diff --git a/src/Option.ts b/src/Option.ts
index d0c62f8f..fc1f656f 100644
--- a/src/Option.ts
+++ b/src/Option.ts
@@ -180,7 +180,7 @@ export function getRight<E, A>(ma: Either<E, A>): Option<A> {
 /**
  * Transforms an `Either` to an `Option` discarding the error.
  *
- * Alias of [getRight](#getRight)
+ * Alias of [getRight](#getright)
  *
  * @category constructors
  * @since 2.0.0
@@ -201,7 +201,7 @@ export const matchW = <B, A, C>(onNone: Lazy<B>, onSome: (a: A) => C) => (ma: Op
   isNone(ma) ? onNone() : onSome(ma.value)
 
 /**
- * Alias of [`matchW`](#matchW).
+ * Alias of [`matchW`](#matchw).
  *
  * @category destructors
  * @since 2.10.0
@@ -246,7 +246,7 @@ export const match: <A, B>(onNone: Lazy<B>, onSome: (a: A) => B) => (ma: Option<
 export const fold = match
 
 /**
- * Less strict version of [`getOrElse`](#getOrElse).
+ * Less strict version of [`getOrElse`](#getorelse).
  *
  * @category destructors
  * @since 2.6.0
@@ -304,7 +304,7 @@ export const fromNullable = <A>(a: A): Option<NonNullable<A>> => (a == null ? no
  * Transforms an exception into an `Option`. If `f` throws, returns `None`, otherwise returns the output wrapped in a
  * `Some`.
  *
- * See also [`tryCatchK`](#tryCatchK).
+ * See also [`tryCatchK`](#trycatchk).
  *
  * @example
  * import { none, some, tryCatch } from 'fp-ts/Option'
@@ -1292,6 +1292,8 @@ export const sequenceArray: <A>(arr: ReadonlyArray<Option<A>>) => Option<Readonl
 // -------------------------------------------------------------------------------------
 
 /**
+ * Use [`chainNullableK`](#chainnullablek) instead.
+ *
  * @category combinators
  * @since 2.0.0
  * @deprecated
@@ -1336,7 +1338,7 @@ export const option: Monad1<URI> &
 }
 
 /**
- * Use `Apply.getApplySemigroup` instead.
+ * Use [`getApplySemigroup`](./Apply.ts.html#getApplySemigroup) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -1347,7 +1349,7 @@ export const getApplySemigroup: <A>(S: Semigroup<A>) => Semigroup<Option<A>> =
   getApplySemigroup_(Apply)
 
 /**
- * Use `Applicative.getApplicativeMonoid` instead.
+ * Use [`getApplicativeMonoid`](./Applicative.ts.html#getApplicativeMonoid) instead.
  *
  * @category instances
  * @since 2.0.0
diff --git a/src/Ord.ts b/src/Ord.ts
index ecb0854d..95d6f5db 100644
--- a/src/Ord.ts
+++ b/src/Ord.ts
@@ -305,7 +305,7 @@ export const between = <A>(O: Ord<A>): ((low: A, hi: A) => (a: A) => boolean) =>
 // -------------------------------------------------------------------------------------
 
 /**
- * Use `tuple` instead.
+ * Use [`tuple`](#tuple) instead.
  *
  * @category combinators
  * @since 2.0.0
@@ -316,7 +316,7 @@ export const getTupleOrd: <T extends ReadonlyArray<Ord<any>>>(
 ) => Ord<{ [K in keyof T]: T[K] extends Ord<infer A> ? A : never }> = tuple
 
 /**
- * Use `reverse` instead.
+ * Use [`reverse`](#reverse) instead.
  *
  * @category combinators
  * @since 2.0.0
@@ -325,7 +325,7 @@ export const getTupleOrd: <T extends ReadonlyArray<Ord<any>>>(
 export const getDualOrd = reverse
 
 /**
- * Use `Contravariant` instead.
+ * Use [`Contravariant`](#contravariant) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -344,7 +344,7 @@ const strictOrd = {
 }
 
 /**
- * Use `boolean.Ord` instead.
+ * Use [`Ord`](./boolean.ts.html#Ord) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -353,7 +353,7 @@ const strictOrd = {
 export const ordBoolean: Ord<boolean> = strictOrd
 
 /**
- * Use `string.Ord` instead.
+ * Use [`Ord`](./string.ts.html#Ord) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -362,7 +362,7 @@ export const ordBoolean: Ord<boolean> = strictOrd
 export const ordString: Ord<string> = strictOrd
 
 /**
- * Use `number.Ord` instead.
+ * Use [`Ord`](./number.ts.html#Ord) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -371,7 +371,7 @@ export const ordString: Ord<string> = strictOrd
 export const ordNumber: Ord<number> = strictOrd
 
 /**
- * Use `Date.Ord` instead.
+ * Use [`Ord`](./Date.ts.html#Ord) instead.
  *
  * @category instances
  * @since 2.0.0
diff --git a/src/Ordering.ts b/src/Ordering.ts
index bf8b5d97..02454188 100644
--- a/src/Ordering.ts
+++ b/src/Ordering.ts
@@ -79,7 +79,7 @@ export const sign = (n: number): Ordering => (n <= -1 ? -1 : n >= 1 ? 1 : 0)
 // -------------------------------------------------------------------------------------
 
 /**
- * Use `reverse` instead.
+ * Use [`reverse`](#reverse) instead.
  *
  * @since 2.0.0
  * @deprecated
@@ -87,7 +87,7 @@ export const sign = (n: number): Ordering => (n <= -1 ? -1 : n >= 1 ? 1 : 0)
 export const invert = reverse
 
 /**
- * Use `Semigroup` instead
+ * Use [`Semigroup`](#semigroup) instead
  *
  * @category instances
  * @since 2.0.0
@@ -96,7 +96,7 @@ export const invert = reverse
 export const semigroupOrdering: S.Semigroup<Ordering> = Semigroup
 
 /**
- * Use `Eq` instead
+ * Use [`Eq`](#eq) instead
  *
  * @category instances
  * @since 2.0.0
@@ -105,7 +105,7 @@ export const semigroupOrdering: S.Semigroup<Ordering> = Semigroup
 export const eqOrdering: E.Eq<Ordering> = Eq
 
 /**
- * Use `Monoid` instead
+ * Use [`Monoid`](#monoid) instead
  *
  * @category instances
  * @since 2.4.0
diff --git a/src/Reader.ts b/src/Reader.ts
index bd6ef87e..1e3706ca 100644
--- a/src/Reader.ts
+++ b/src/Reader.ts
@@ -473,7 +473,7 @@ export const reader: Monad2<URI> & Profunctor2<URI> & Category2<URI> & Strong2<U
 }
 
 /**
- * Use `Apply.getApplySemigroup` instead.
+ * Use [`getApplySemigroup`](./Apply.ts.html#getApplySemigroup) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -484,7 +484,7 @@ export const getSemigroup: <R, A>(S: Semigroup<A>) => Semigroup<Reader<R, A>> =
   getApplySemigroup(Apply)
 
 /**
- * Use `Applicative.getApplicativeMonoid` instead.
+ * Use [`getApplicativeMonoid`](./Applicative.ts.html#getApplicativeMonoid) instead.
  *
  * @category instances
  * @since 2.0.0
diff --git a/src/ReaderEither.ts b/src/ReaderEither.ts
index 8e591454..a11350cb 100644
--- a/src/ReaderEither.ts
+++ b/src/ReaderEither.ts
@@ -148,7 +148,7 @@ export const matchE: <R, E, A, B>(
   ET.matchE(R.Monad)
 
 /**
- * Alias of [`matchE`](#matchE).
+ * Alias of [`matchE`](#matche).
  *
  * @category destructors
  * @since 2.0.0
@@ -156,7 +156,7 @@ export const matchE: <R, E, A, B>(
 export const fold = matchE
 
 /**
- * Less strict version of [`matchE`](#matchE).
+ * Less strict version of [`matchE`](#matche).
  *
  * @category destructors
  * @since 2.10.0
@@ -167,7 +167,7 @@ export const matchEW: <E, R2, B, A, R3, C>(
 ) => <R1>(ma: ReaderEither<R1, E, A>) => Reader<R1 & R2 & R3, B | C> = matchE as any
 
 /**
- * Alias of [`matchEW`](#matchEW).
+ * Alias of [`matchEW`](#matchew).
  *
  * @category destructors
  * @since 2.10.0
@@ -183,7 +183,7 @@ export const getOrElse: <E, R, A>(onLeft: (e: E) => Reader<R, A>) => (ma: Reader
   ET.getOrElse(R.Monad)
 
 /**
- * Less strict version of [`getOrElse`](#getOrElse).
+ * Less strict version of [`getOrElse`](#getorelse).
  *
  * @category destructors
  * @since 2.6.0
@@ -219,7 +219,7 @@ export const orElse: <E1, R, E2, A>(
   ET.orElse(R.Monad)
 
 /**
- * Less strict version of [`orElse`](#orElse).
+ * Less strict version of [`orElse`](#orelse).
  *
  * @category combinators
  * @since 2.10.0
@@ -370,7 +370,7 @@ export const alt: <R, E, A>(that: () => ReaderEither<R, E, A>) => (fa: ReaderEit
  */
 export const altW: <R2, E2, B>(
   that: () => ReaderEither<R2, E2, B>
-) => <R1, E1, A>(fa: ReaderEither<R1, E1, A>) => ReaderEither<R1 & R2, E1 | E2, A | B> = alt as any
+) => <R1, E1, A>(fa: ReaderEither<R1, E1, A>) => ReaderEither<R1 & R2, E2, A | B> = alt as any
 
 /**
  * @category MonadThrow
@@ -580,7 +580,7 @@ export const chainFirst: <R, E, A, B>(
   chainFirst_(Chain)
 
 /**
- * Less strict version of [`chainFirst`](#chainFirst)
+ * Less strict version of [`chainFirst`](#chainfirst)
  *
  * Derivable from `Chain`.
  *
@@ -668,7 +668,7 @@ export const chainEitherK: <E, A, B>(
   chainEitherK_(FromEither, Chain)
 
 /**
- * Less strict version of [`chainEitherK`](#chainEitherK).
+ * Less strict version of [`chainEitherK`](#chaineitherk).
  *
  * @category combinators
  * @since 2.6.1
@@ -702,7 +702,7 @@ export const filterOrElse: {
   filterOrElse_(FromEither, Chain)
 
 /**
- * Less strict version of [`filterOrElse`](#filterOrElse).
+ * Less strict version of [`filterOrElse`](#filterorelse).
  *
  * @category combinators
  * @since 2.9.0
@@ -840,10 +840,7 @@ export const readerEither: Monad3<URI> & Bifunctor3<URI> & Alt3<URI> & MonadThro
 }
 
 /**
- * Use `Apply.getApplySemigroup` instead.
- *
- * Semigroup returning the left-most `Left` value. If both operands are `Right`s then the inner values
- * are concatenated using the provided `Semigroup`
+ * Use [`getApplySemigroup`](./Apply.ts.html#getApplySemigroup) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -854,7 +851,7 @@ export const getApplySemigroup: <R, E, A>(S: Semigroup<A>) => Semigroup<ReaderEi
   getApplySemigroup_(Apply)
 
 /**
- * Use `Applicative.getApplicativeMonoid` instead.
+ * Use [`getApplicativeMonoid`](./Applicative.ts.html#getApplicativeMonoid) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -865,10 +862,7 @@ export const getApplyMonoid: <R, E, A>(M: Monoid<A>) => Monoid<ReaderEither<R, E
   getApplicativeMonoid(Applicative)
 
 /**
- * Use `Apply.getApplySemigroup` instead.
- *
- * Semigroup returning the left-most non-`Left` value. If both operands are `Right`s then the inner values are
- * concatenated using the provided `Semigroup`
+ * Use [`getApplySemigroup`](./Apply.ts.html#getApplySemigroup) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -878,7 +872,7 @@ export const getSemigroup = <R, E, A>(S: Semigroup<A>): Semigroup<ReaderEither<R
   getApplySemigroup_(R.Apply)(E.getSemigroup(S))
 
 /**
- * Use `getApplicativeReaderValidation` and `getAltReaderValidation` instead.
+ * Use [`getApplicativeReaderValidation`](#getapplicativereadervalidation) and [`getAltReaderValidation`](#getaltreadervalidation) instead.
  *
  * @category instances
  * @since 2.3.0
@@ -904,7 +898,7 @@ export function getReaderValidation<E>(
 }
 
 /**
- * Use `Reader`'s `local` instead.
+ * Use [`local`](./Reader.ts.html#local) instead.
  *
  * @category combinators
  * @since 2.0.0
diff --git a/src/ReaderTask.ts b/src/ReaderTask.ts
index 11ec89dc..19e22437 100644
--- a/src/ReaderTask.ts
+++ b/src/ReaderTask.ts
@@ -574,7 +574,7 @@ export const readerTaskSeq: typeof readerTask = {
 }
 
 /**
- * Use `Apply.getApplySemigroup` instead.
+ * Use [`getApplySemigroup`](./Apply.ts.html#getApplySemigroup) instead.
  *
  * @category instances
  * @since 2.3.0
@@ -585,7 +585,7 @@ export const getSemigroup: <R, A>(S: Semigroup<A>) => Semigroup<ReaderTask<R, A>
   getApplySemigroup_(ApplySeq)
 
 /**
- * Use `Applicative.getApplicativeMonoid` instead.
+ * Use [`getApplicativeMonoid`](./Applicative.ts.html#getApplicativeMonoid) instead.
  *
  * @category instances
  * @since 2.3.0
@@ -605,7 +605,7 @@ export function run<R, A>(ma: ReaderTask<R, A>, r: R): Promise<A> {
 }
 
 /**
- * Use `Reader`'s `local` instead.
+ * Use [`local`](./Reader.ts.html#local) instead.
  *
  * @category combinators
  * @since 2.3.0
diff --git a/src/ReaderTaskEither.ts b/src/ReaderTaskEither.ts
index 8ddeb711..500b3a22 100644
--- a/src/ReaderTaskEither.ts
+++ b/src/ReaderTaskEither.ts
@@ -251,7 +251,7 @@ export const matchE: <R, E, A, B>(
   ET.matchE(RT.Chain)
 
 /**
- * Alias of [`matchE`](#matchE).
+ * Alias of [`matchE`](#matche).
  *
  * @category destructors
  * @since 2.0.0
@@ -259,7 +259,7 @@ export const matchE: <R, E, A, B>(
 export const fold = matchE
 
 /**
- * Less strict version of [`matchE`](#matchE).
+ * Less strict version of [`matchE`](#matche).
  *
  * @category destructors
  * @since 2.10.0
@@ -270,7 +270,7 @@ export const matchEW: <E, R2, B, A, R3, C>(
 ) => <R1>(ma: ReaderTaskEither<R1, E, A>) => ReaderTask<R1 & R2 & R3, B | C> = matchE as any
 
 /**
- * Alias of [`matchEW`](#matchEW).
+ * Alias of [`matchEW`](#matchew).
  *
  * @category destructors
  * @since 2.10.0
@@ -288,7 +288,7 @@ export const getOrElse: <R, E, A>(
   ET.getOrElse(RT.Monad)
 
 /**
- * Less strict version of [`getOrElse`](#getOrElse).
+ * Less strict version of [`getOrElse`](#getorelse).
  *
  * @category destructors
  * @since 2.6.0
@@ -324,7 +324,7 @@ export const orElse: <R, E1, A, E2>(
   ET.orElse(RT.Monad)
 
 /**
- * Less strict version of [`orElse`](#orElse).
+ * Less strict version of [`orElse`](#orelse).
  *
  * @category combinators
  * @since 2.10.0
@@ -350,7 +350,7 @@ export const fromIOEitherK = <E, A extends ReadonlyArray<unknown>, B>(
 ): (<R>(...a: A) => ReaderTaskEither<R, E, B>) => flow(f, fromIOEither)
 
 /**
- * Less strict version of [`chainIOEitherK`](#chainIOEitherK).
+ * Less strict version of [`chainIOEitherK`](#chainioeitherk).
  *
  * @category combinators
  * @since 2.6.1
@@ -376,7 +376,7 @@ export const fromTaskEitherK = <E, A extends ReadonlyArray<unknown>, B>(
 ): (<R>(...a: A) => ReaderTaskEither<R, E, B>) => flow(f, fromTaskEither)
 
 /**
- * Less strict version of [`chainTaskEitherK`](#chainTaskEitherK).
+ * Less strict version of [`chainTaskEitherK`](#chaintaskeitherk).
  *
  * @category combinators
  * @since 2.6.1
@@ -532,7 +532,7 @@ export const alt: <R, E, A>(
  */
 export const altW: <R2, E2, B>(
   that: () => ReaderTaskEither<R2, E2, B>
-) => <R1, E1, A>(fa: ReaderTaskEither<R1, E1, A>) => ReaderTaskEither<R1 & R2, E1 | E2, A | B> = alt as any
+) => <R1, E1, A>(fa: ReaderTaskEither<R1, E1, A>) => ReaderTaskEither<R1 & R2, E2, A | B> = alt as any
 
 /**
  * @category MonadThrow
@@ -803,7 +803,7 @@ export const chainFirst: <R, E, A, B>(
   chainFirst_(Chain)
 
 /**
- * Less strict version of [`chainFirst`](#chainFirst).
+ * Less strict version of [`chainFirst`](#chainfirst).
  *
  * Derivable from `Chain`.
  *
@@ -878,7 +878,7 @@ export const chainEitherK: <E, A, B>(
   chainEitherK_(FromEither, Chain)
 
 /**
- * Less strict version of [`chainEitherK`](#chainEitherK).
+ * Less strict version of [`chainEitherK`](#chaineitherk).
  *
  * @category combinators
  * @since 2.6.1
@@ -912,7 +912,7 @@ export const filterOrElse: {
   filterOrElse_(FromEither, Chain)
 
 /**
- * Less strict version of [`filterOrElse`](#filterOrElse).
+ * Less strict version of [`filterOrElse`](#filterorelse).
  *
  * @category combinators
  * @since 2.9.0
@@ -1198,7 +1198,7 @@ export const readerTaskEitherSeq: typeof readerTaskEither = {
 }
 
 /**
- * Use `Apply.getApplySemigroup` instead.
+ * Use [`getApplySemigroup`](./Apply.ts.html#getApplySemigroup) instead.
  *
  * Semigroup returning the left-most `Left` value. If both operands are `Right`s then the inner values
  * are concatenated using the provided `Semigroup`
@@ -1212,7 +1212,7 @@ export const getApplySemigroup: <R, E, A>(S: Semigroup<A>) => Semigroup<ReaderTa
   getApplySemigroup_(ApplySeq)
 
 /**
- * Use `Applicative.getApplicativeMonoid` instead.
+ * Use [`getApplicativeMonoid`](./Applicative.ts.html#getApplicativeMonoid) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -1223,10 +1223,7 @@ export const getApplyMonoid: <R, E, A>(M: Monoid<A>) => Monoid<ReaderTaskEither<
   getApplicativeMonoid(ApplicativeSeq)
 
 /**
- * Use `Apply.getApplySemigroup` instead.
- *
- * Semigroup returning the left-most non-`Left` value. If both operands are `Right`s then the inner values are
- * concatenated using the provided `Semigroup`
+ * Use [`getApplySemigroup`](./Apply.ts.html#getApplySemigroup) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -1236,7 +1233,7 @@ export const getSemigroup = <R, E, A>(S: Semigroup<A>): Semigroup<ReaderTaskEith
   getApplySemigroup_(RT.ApplySeq)(E.getSemigroup(S))
 
 /**
- * Use `getApplicativeReaderTaskValidation` and `getAltReaderTaskValidation` instead.
+ * Use [`getApplicativeReaderTaskValidation`](#getapplicativereadertaskvalidation) and [`getAltReaderTaskValidation`](#getaltreadertaskvalidation) instead.
  *
  * @category instances
  * @since 2.3.0
@@ -1273,7 +1270,7 @@ export function run<R, E, A>(ma: ReaderTaskEither<R, E, A>, r: R): Promise<Eithe
 }
 
 /**
- * Use `Reader`'s `local` instead.
+ * Use [`local`](./Reader.ts.html#local) instead.
  *
  * @category combinators
  * @since 2.0.0
diff --git a/src/ReadonlyArray.ts b/src/ReadonlyArray.ts
index a396e27c..335a4377 100644
--- a/src/ReadonlyArray.ts
+++ b/src/ReadonlyArray.ts
@@ -135,7 +135,7 @@ export const matchLeft = <B, A>(onEmpty: Lazy<B>, onNonEmpty: (head: A, tail: Re
 ): B => (isNonEmpty(as) ? onNonEmpty(RNEA.head(as), RNEA.tail(as)) : onEmpty())
 
 /**
- * Alias of [`matchLeft`](#matchLeft).
+ * Alias of [`matchLeft`](#matchleft).
  *
  * @category destructors
  * @since 2.5.0
@@ -156,7 +156,7 @@ export const matchRight = <B, A>(onEmpty: Lazy<B>, onNonEmpty: (init: ReadonlyAr
 ): B => (isNonEmpty(as) ? onNonEmpty(RNEA.init(as), RNEA.last(as)) : onEmpty())
 
 /**
- * Alias of [`matchRight`](#matchRight).
+ * Alias of [`matchRight`](#matchright).
  *
  * @category destructors
  * @since 2.5.0
@@ -2220,7 +2220,7 @@ export const apS =
 // -------------------------------------------------------------------------------------
 
 /**
- * Use `prepend` instead.
+ * Use [`prepend`](#prepend) instead.
  *
  * @category constructors
  * @since 2.5.0
@@ -2230,7 +2230,7 @@ export const apS =
 export const cons = RNEA.cons
 
 /**
- * Use `append` instead.
+ * Use [`append`](#append) instead.
  *
  * @category constructors
  * @since 2.5.0
@@ -2240,7 +2240,7 @@ export const cons = RNEA.cons
 export const snoc = RNEA.snoc
 
 /**
- * Use `prependAll` instead.
+ * Use [`prependAll`](#prependall) instead.
  *
  * @category combinators
  * @since 2.9.0
diff --git a/src/ReadonlyMap.ts b/src/ReadonlyMap.ts
index 554f2d0a..9ecf9765 100644
--- a/src/ReadonlyMap.ts
+++ b/src/ReadonlyMap.ts
@@ -1005,7 +1005,7 @@ export function getWitherable<K>(O: Ord<K>): Witherable2C<URI, K> & TraversableW
 // -------------------------------------------------------------------------------------
 
 /**
- * Use `upsertAt` instead.
+ * Use [`upsertAt`](#upsertat) instead.
  *
  * @category combinators
  * @since 2.5.0
diff --git a/src/ReadonlyNonEmptyArray.ts b/src/ReadonlyNonEmptyArray.ts
index c6435df3..74af30e9 100644
--- a/src/ReadonlyNonEmptyArray.ts
+++ b/src/ReadonlyNonEmptyArray.ts
@@ -1112,7 +1112,7 @@ export const concatAll = <A>(S: Semigroup<A>) => (as: ReadonlyNonEmptyArray<A>):
 // -------------------------------------------------------------------------------------
 
 /**
- * Use `ReadonlyArray`'s `filter` instead.
+ * Use [`filter`](./ReadonlyArray.ts.html#filter) instead.
  *
  * @category combinators
  * @since 2.5.0
@@ -1128,7 +1128,7 @@ export function filter<A>(predicate: Predicate<A>): (as: ReadonlyNonEmptyArray<A
 }
 
 /**
- * Use `ReadonlyArray`'s `filterWithIndex` instead.
+ * Use [`filterWithIndex`](./ReadonlyArray.ts.html#filterWithIndex) instead.
  *
  * @category combinators
  * @since 2.5.0
@@ -1139,7 +1139,7 @@ export const filterWithIndex = <A>(predicate: (i: number, a: A) => boolean) => (
 ): Option<ReadonlyNonEmptyArray<A>> => fromReadonlyArray(as.filter((a, i) => predicate(i, a)))
 
 /**
- * Use `unprepend` instead.
+ * Use [`unprepend`](#unprepend) instead.
  *
  * @category destructors
  * @since 2.10.0
@@ -1148,7 +1148,7 @@ export const filterWithIndex = <A>(predicate: (i: number, a: A) => boolean) => (
 export const uncons: <A>(as: ReadonlyNonEmptyArray<A>) => readonly [A, ReadonlyArray<A>] = unprepend
 
 /**
- * Use `unappend` instead.
+ * Use [`unappend`](#unappend) instead.
  *
  * @category destructors
  * @since 2.10.0
@@ -1157,7 +1157,7 @@ export const uncons: <A>(as: ReadonlyNonEmptyArray<A>) => readonly [A, ReadonlyA
 export const unsnoc: <A>(as: ReadonlyNonEmptyArray<A>) => readonly [ReadonlyArray<A>, A] = unappend
 
 /**
- * Use `ReadonlyArray`'s `prepend` instead.
+ * Use [`prepend`](./ReadonlyArray.ts.html#prepend) instead.
  *
  * @category constructors
  * @since 2.5.0
@@ -1174,7 +1174,7 @@ export function cons<A>(
 }
 
 /**
- * Use `ReadonlyArray`'s `append` instead.
+ * Use [`append`](./ReadonlyArray.ts.html#append) instead.
  *
  * @category constructors
  * @since 2.5.0
@@ -1183,7 +1183,7 @@ export function cons<A>(
 export const snoc = <A>(init: ReadonlyArray<A>, end: A): ReadonlyNonEmptyArray<A> => concat(init, [end])
 
 /**
- * Use `ReadonlyArray`'s `insertAt` instead.
+ * Use [`insertAt`](./ReadonlyArray.ts.html#insertAt) instead.
  *
  * @category combinators
  * @since 2.5.0
@@ -1193,7 +1193,7 @@ export const insertAt = <A>(i: number, a: A) => (as: ReadonlyArray<A>): Option<R
   i < 0 || i > as.length ? O.none : O.some(unsafeInsertAt(i, a, as))
 
 /**
- * Use `prependAll` instead.
+ * Use [`prependAll`](#prependall) instead.
  *
  * @category combinators
  * @since 2.9.0
@@ -1202,7 +1202,7 @@ export const insertAt = <A>(i: number, a: A) => (as: ReadonlyArray<A>): Option<R
 export const prependToAll = prependAll
 
 /**
- * Use `concatAll` instead.
+ * Use [`concatAll`](#concatall) instead.
  *
  * @since 2.5.0
  * @deprecated
diff --git a/src/ReadonlyRecord.ts b/src/ReadonlyRecord.ts
index 2734e624..d0b8394d 100644
--- a/src/ReadonlyRecord.ts
+++ b/src/ReadonlyRecord.ts
@@ -71,7 +71,7 @@ export const size = (r: ReadonlyRecord<string, unknown>): number => Object.keys(
  */
 export const isEmpty = (r: ReadonlyRecord<string, unknown>): boolean => {
   for (const k in r) {
-    if (_.hasOwnProperty.call(r, k)) {
+    if (_.has.call(r, k)) {
       return false
     }
   }
@@ -144,7 +144,7 @@ export function toUnfoldable<F>(U: Unfoldable<F>): <A>(r: ReadonlyRecord<string,
  * @since 2.10.0
  */
 export const upsertAt = <A>(k: string, a: A) => (r: ReadonlyRecord<string, A>): ReadonlyRecord<string, A> => {
-  if (_.hasOwnProperty.call(r, k) && r[k] === a) {
+  if (_.has.call(r, k) && r[k] === a) {
     return r
   }
   const out: Record<string, A> = Object.assign({}, r)
@@ -159,7 +159,7 @@ export const upsertAt = <A>(k: string, a: A) => (r: ReadonlyRecord<string, A>):
  *
  * @since 2.10.0
  */
-export const has = <K extends string>(k: string, r: ReadonlyRecord<K, unknown>): k is K => _.hasOwnProperty.call(r, k)
+export const has = <K extends string>(k: string, r: ReadonlyRecord<K, unknown>): k is K => _.has.call(r, k)
 
 /**
  * Delete a key and value from a `ReadonlyRecord`.
@@ -172,7 +172,7 @@ export function deleteAt<K extends string>(
 ): <KS extends string, A>(r: ReadonlyRecord<KS, A>) => ReadonlyRecord<string extends K ? string : Exclude<KS, K>, A>
 export function deleteAt(k: string): <A>(r: ReadonlyRecord<string, A>) => ReadonlyRecord<string, A> {
   return <A>(r: ReadonlyRecord<string, A>) => {
-    if (!_.hasOwnProperty.call(r, k)) {
+    if (!_.has.call(r, k)) {
       return r
     }
     const out: Record<string, A> = Object.assign({}, r)
@@ -258,7 +258,7 @@ export function isSubrecord<A>(
       return (that) => isSubrecordE(that, me)
     }
     for (const k in me) {
-      if (!_.hasOwnProperty.call(that, k) || !E.equals(me[k], that[k])) {
+      if (!_.has.call(that, k) || !E.equals(me[k], that[k])) {
         return false
       }
     }
@@ -281,7 +281,7 @@ export function lookup<A>(
   if (r === undefined) {
     return (r) => lookup(k, r)
   }
-  return _.hasOwnProperty.call(r, k) ? O.some(r[k]) : O.none
+  return _.has.call(r, k) ? O.some(r[k]) : O.none
 }
 
 /**
@@ -304,7 +304,7 @@ export function mapWithIndex<A, B>(
   return (r) => {
     const out: Record<string, B> = {}
     for (const k in r) {
-      if (_.hasOwnProperty.call(r, k)) {
+      if (_.has.call(r, k)) {
         out[k] = f(k, r[k])
       }
     }
@@ -548,7 +548,7 @@ export function partitionMapWithIndex<A, B, C>(
     const left: Record<string, B> = {}
     const right: Record<string, C> = {}
     for (const k in r) {
-      if (_.hasOwnProperty.call(r, k)) {
+      if (_.has.call(r, k)) {
         const e = f(k, r[k])
         switch (e._tag) {
           case 'Left':
@@ -580,7 +580,7 @@ export function partitionWithIndex<A>(
     const left: Record<string, A> = {}
     const right: Record<string, A> = {}
     for (const k in r) {
-      if (_.hasOwnProperty.call(r, k)) {
+      if (_.has.call(r, k)) {
         const a = r[k]
         if (predicateWithIndex(k, a)) {
           right[k] = a
@@ -606,7 +606,7 @@ export function filterMapWithIndex<A, B>(
   return (r) => {
     const out: Record<string, B> = {}
     for (const k in r) {
-      if (_.hasOwnProperty.call(r, k)) {
+      if (_.has.call(r, k)) {
         const ob = f(k, r[k])
         if (_.isSome(ob)) {
           out[k] = ob.value
@@ -633,7 +633,7 @@ export function filterWithIndex<A>(
     const out: Record<string, A> = {}
     let changed = false
     for (const key in fa) {
-      if (_.hasOwnProperty.call(fa, key)) {
+      if (_.has.call(fa, key)) {
         const a = fa[key]
         if (predicateWithIndex(key, a)) {
           out[key] = a
@@ -734,7 +734,7 @@ export function fromFoldableMap<F, B>(
   return <A>(ta: HKT<F, A>, f: (a: A) => readonly [string, B]) => {
     return F.reduce<A, Record<string, B>>(ta, {}, (r, a) => {
       const [k, b] = f(a)
-      r[k] = _.hasOwnProperty.call(r, k) ? M.concat(r[k], b) : b
+      r[k] = _.has.call(r, k) ? M.concat(r[k], b) : b
       return r
     })
   }
@@ -957,7 +957,7 @@ export const reduceRight: <A, B>(b: B, f: (a: A, b: B) => B) => (fa: Readonly<Re
 export const compact = <A>(r: Readonly<Record<string, Option<A>>>): Readonly<Record<string, A>> => {
   const out: Record<string, A> = {}
   for (const k in r) {
-    if (_.hasOwnProperty.call(r, k)) {
+    if (_.has.call(r, k)) {
       const oa = r[k]
       if (_.isSome(oa)) {
         out[k] = oa.value
@@ -977,7 +977,7 @@ export const separate = <A, B>(
   const left: Record<string, A> = {}
   const right: Record<string, B> = {}
   for (const k in r) {
-    if (_.hasOwnProperty.call(r, k)) {
+    if (_.has.call(r, k)) {
       const e = r[k]
       if (_.isLeft(e)) {
         left[k] = e.left
@@ -1059,8 +1059,8 @@ export function getMonoid<A>(S: Semigroup<A>): Monoid<ReadonlyRecord<string, A>>
       }
       const r: Record<string, A> = Object.assign({}, first)
       for (const k in second) {
-        if (_.hasOwnProperty.call(second, k)) {
-          r[k] = _.hasOwnProperty.call(first, k) ? S.concat(first[k], second[k]) : second[k]
+        if (_.has.call(second, k)) {
+          r[k] = _.has.call(first, k) ? S.concat(first[k], second[k]) : second[k]
         }
       }
       return r
@@ -1228,7 +1228,7 @@ export const Witherable: Witherable1<URI> = {
 // -------------------------------------------------------------------------------------
 
 /**
- * Use `upsertAt` instead.
+ * Use [`upsertAt`](#upsertat) instead.
  *
  * @category combinators
  * @since 2.5.0
@@ -1240,14 +1240,14 @@ export const insertAt: <A>(
 ) => (r: Readonly<Record<string, A>>) => Readonly<Record<string, A>> = upsertAt
 
 /**
- * Use `has` instead.
+ * Use [`has`](#has) instead.
  *
  * @since 2.5.0
  * @deprecated
  */
 export function hasOwnProperty<K extends string>(k: string, r: ReadonlyRecord<K, unknown>): k is K
 export function hasOwnProperty<K extends string>(this: any, k: string, r?: ReadonlyRecord<K, unknown>): k is K {
-  return _.hasOwnProperty.call(r === undefined ? this : r, k)
+  return _.has.call(r === undefined ? this : r, k)
 }
 
 /**
diff --git a/src/ReadonlySet.ts b/src/ReadonlySet.ts
index 8c011714..21d3cd00 100644
--- a/src/ReadonlySet.ts
+++ b/src/ReadonlySet.ts
@@ -561,7 +561,7 @@ export const toReadonlyArray = <A>(O: Ord<A>) => (set: ReadonlySet<A>): Readonly
 // -------------------------------------------------------------------------------------
 
 /**
- * Use `fromReadonlyArray` instead.
+ * Use [`fromReadonlyArray`](#fromreadonlyarray) instead.
  *
  * @category constructors
  * @since 2.5.0
diff --git a/src/ReadonlyTuple.ts b/src/ReadonlyTuple.ts
index 5c2b4cbe..e3e66a4d 100644
--- a/src/ReadonlyTuple.ts
+++ b/src/ReadonlyTuple.ts
@@ -385,7 +385,7 @@ export const Traversable: Traversable2<URI> = {
 // -------------------------------------------------------------------------------------
 
 /**
- * Use `mapFst` instead.
+ * Use [`mapFst`](#mapfst) instead.
  *
  * @since 2.5.0
  * @deprecated
@@ -393,7 +393,7 @@ export const Traversable: Traversable2<URI> = {
 export const map: <A, B>(f: (a: A) => B) => <E>(fa: readonly [A, E]) => readonly [B, E] = mapFst
 
 /**
- * Use `mapSnd` instead.
+ * Use [`mapSnd`](#mapsnd) instead.
  *
  * @since 2.5.0
  * @deprecated
diff --git a/src/Record.ts b/src/Record.ts
index 86a52a0e..a305ce39 100644
--- a/src/Record.ts
+++ b/src/Record.ts
@@ -858,7 +858,7 @@ export const Witherable: Witherable1<URI> = {
 export const empty: Record<string, never> = {}
 
 /**
- * Use `upsertAt` instead.
+ * Use [`upsertAt`](#upsertat) instead.
  *
  * @since 2.0.0
  * @deprecated
@@ -866,12 +866,13 @@ export const empty: Record<string, never> = {}
 export const insertAt: <A>(k: string, a: A) => (r: Record<string, A>) => Record<string, A> = upsertAt
 
 /**
- * Use `has` instead.
+ * Use [`has`](#has) instead.
  *
  * @since 2.0.0
  * @deprecated
  */
-export const hasOwnProperty: <K extends string>(k: string, r: Record<K, unknown>) => k is K = RR.has
+// tslint:disable-next-line: deprecation
+export const hasOwnProperty: <K extends string>(k: string, r: Record<K, unknown>) => k is K = RR.hasOwnProperty
 
 /**
  * Use small, specific instances instead.
diff --git a/src/Ring.ts b/src/Ring.ts
index f725ef8c..77f8d9bb 100644
--- a/src/Ring.ts
+++ b/src/Ring.ts
@@ -70,7 +70,7 @@ export const negate = <A>(R: Ring<A>) => (a: A) => R.sub(R.zero, a)
 // -------------------------------------------------------------------------------------
 
 /**
- * Use `tuple` instead.
+ * Use [`tuple`](#tuple) instead.
  *
  * @category combinators
  * @since 2.0.0
@@ -81,7 +81,7 @@ export const getTupleRing: <T extends ReadonlyArray<Ring<any>>>(
 ) => Ring<{ [K in keyof T]: T[K] extends Ring<infer A> ? A : never }> = tuple as any
 
 /**
- * Use `function.getRing` instead.
+ * Use [`getRing`](./function.ts.html#getRing) instead.
  *
  * @category instances
  * @since 2.0.0
diff --git a/src/Semigroup.ts b/src/Semigroup.ts
index 4bb79d9a..fbba94f5 100644
--- a/src/Semigroup.ts
+++ b/src/Semigroup.ts
@@ -151,7 +151,7 @@ export const struct = <A>(
   concat: (first, second) => {
     const r: A = {} as any
     for (const k in semigroups) {
-      if (_.hasOwnProperty.call(semigroups, k)) {
+      if (_.has.call(semigroups, k)) {
         r[k] = semigroups[k].concat(first[k], second[k])
       }
     }
@@ -266,7 +266,7 @@ export const concatAll = <A>(S: Semigroup<A>) => (startWith: A) => (as: Readonly
 // -------------------------------------------------------------------------------------
 
 /**
- * Use `object.getAssignSemigroup` instead.
+ * Use [`getAssignSemigroup`](./struct.ts.html#getAssignSemigroup) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -277,7 +277,7 @@ export const getObjectSemigroup = <A extends object = never>(): Semigroup<A> =>
 })
 
 /**
- * Use `last` instead.
+ * Use [`last`](#last) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -286,7 +286,7 @@ export const getObjectSemigroup = <A extends object = never>(): Semigroup<A> =>
 export const getLastSemigroup = last
 
 /**
- * Use `first` instead.
+ * Use [`first`](#first) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -295,7 +295,7 @@ export const getLastSemigroup = last
 export const getFirstSemigroup = first
 
 /**
- * Use `tuple` instead.
+ * Use [`tuple`](#tuple) instead.
  *
  * @category combinators
  * @since 2.0.0
@@ -306,7 +306,7 @@ export const getTupleSemigroup: <T extends ReadonlyArray<Semigroup<any>>>(
 ) => Semigroup<{ [K in keyof T]: T[K] extends Semigroup<infer A> ? A : never }> = tuple as any
 
 /**
- * Use `struct` instead.
+ * Use [`struct`](#struct) instead.
  *
  * @category combinators
  * @since 2.0.0
@@ -317,7 +317,7 @@ export const getStructSemigroup: <O extends ReadonlyRecord<string, any>>(
 ) => Semigroup<O> = struct
 
 /**
- * Use `reverse` instead.
+ * Use [`reverse`](#reverse) instead.
  *
  * @category combinators
  * @since 2.0.0
@@ -326,7 +326,7 @@ export const getStructSemigroup: <O extends ReadonlyRecord<string, any>>(
 export const getDualSemigroup = reverse
 
 /**
- * Use `max` instead.
+ * Use [`max`](#max) instead.
  *
  * @category constructors
  * @since 2.0.0
@@ -335,7 +335,7 @@ export const getDualSemigroup = reverse
 export const getJoinSemigroup = max
 
 /**
- * Use `min` instead.
+ * Use [`min`](#min) instead.
  *
  * @category constructors
  * @since 2.0.0
@@ -344,7 +344,7 @@ export const getJoinSemigroup = max
 export const getMeetSemigroup = min
 
 /**
- * Use `intercalate` instead.
+ * Use [`intercalate`](#intercalate) instead.
  *
  * @category combinators
  * @since 2.5.0
@@ -353,7 +353,7 @@ export const getMeetSemigroup = min
 export const getIntercalateSemigroup = intercalate
 
 /**
- * Use `concatAll` instead.
+ * Use [`concatAll`](#concatall) instead.
  *
  * @since 2.0.0
  * @deprecated
@@ -370,7 +370,7 @@ export function fold<A>(S: Semigroup<A>): (startWith: A, as?: ReadonlyArray<A>)
 }
 
 /**
- * Use `boolean.SemigroupAll` instead.
+ * Use [`SemigroupAll`](./boolean.ts.html#SemigroupAll) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -381,7 +381,7 @@ export const semigroupAll: Semigroup<boolean> = {
 }
 
 /**
- * Use `boolean.SemigroupAny` instead.
+ * Use [`SemigroupAny`](./boolean.ts.html#SemigroupAny) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -392,7 +392,7 @@ export const semigroupAny: Semigroup<boolean> = {
 }
 
 /**
- * Use `function.getSemigroup` instead.
+ * Use [`getSemigroup`](./function.ts.html#getSemigroup) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -401,7 +401,7 @@ export const semigroupAny: Semigroup<boolean> = {
 export const getFunctionSemigroup: <S>(S: Semigroup<S>) => <A = never>() => Semigroup<(a: A) => S> = getSemigroup
 
 /**
- * Use `string.Semigroup` instead.
+ * Use [`Semigroup`](./string.ts.html#Semigroup) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -412,7 +412,7 @@ export const semigroupString: Semigroup<string> = {
 }
 
 /**
- * Use `number.SemigroupSum` instead.
+ * Use [`SemigroupSum`](./number.ts.html#SemigroupSum) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -423,7 +423,7 @@ export const semigroupSum: Semigroup<number> = {
 }
 
 /**
- * Use `number.SemigroupProduct` instead.
+ * Use [`SemigroupProduct`](./number.ts.html#SemigroupProduct) instead.
  *
  * @category instances
  * @since 2.0.0
diff --git a/src/Semiring.ts b/src/Semiring.ts
index f31ae4bc..cb1b6575 100644
--- a/src/Semiring.ts
+++ b/src/Semiring.ts
@@ -43,7 +43,7 @@ export interface Semiring<A> {
 // -------------------------------------------------------------------------------------
 
 /**
- * Use `function.getSemiring` instead.
+ * Use [`getSemiring`](./function.ts.html#getSemiring) instead.
  *
  * @category instances
  * @since 2.0.0
diff --git a/src/Set.ts b/src/Set.ts
index 1649c055..98c199bc 100644
--- a/src/Set.ts
+++ b/src/Set.ts
@@ -469,7 +469,7 @@ export const toArray = <A>(O: Ord<A>) => (set: Set<A>): Array<A> => {
 // -------------------------------------------------------------------------------------
 
 /**
- * Use `isSubset` instead.
+ * Use [`isSubset`](#issubset) instead.
  *
  * @since 2.0.0
  * @deprecated
diff --git a/src/Show.ts b/src/Show.ts
index dd42bc14..8c72fb50 100644
--- a/src/Show.ts
+++ b/src/Show.ts
@@ -35,7 +35,7 @@ export const struct = <A>(shows: { [K in keyof A]: Show<A[K]> }): Show<{ readonl
   show: (a) => {
     let s = '{'
     for (const k in shows) {
-      if (_.hasOwnProperty.call(shows, k)) {
+      if (_.has.call(shows, k)) {
         s += ` ${k}: ${shows[k].show(a[k])},`
       }
     }
@@ -62,7 +62,7 @@ export const tuple = <A extends ReadonlyArray<unknown>>(
 // -------------------------------------------------------------------------------------
 
 /**
- * Use `tuple` instead.
+ * Use [`tuple`](#tuple) instead.
  *
  * @category combinators
  * @since 2.0.0
@@ -73,7 +73,7 @@ export const getTupleShow: <T extends ReadonlyArray<Show<any>>>(
 ) => Show<{ [K in keyof T]: T[K] extends Show<infer A> ? A : never }> = tuple
 
 /**
- * Use `struct` instead.
+ * Use [`struct`](#struct) instead.
  *
  * @category combinators
  * @since 2.0.0
@@ -84,7 +84,7 @@ export const getStructShow: <O extends ReadonlyRecord<string, any>>(
 ) => Show<O> = struct
 
 /**
- * Use `boolean.Show` instead.
+ * Use [`Show`](./boolean.ts.html#Show) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -95,7 +95,7 @@ export const showBoolean: Show<boolean> = {
 }
 
 /**
- * Use `string.Show` instead.
+ * Use [`Show`](./string.ts.html#Show) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -106,7 +106,7 @@ export const showString: Show<string> = {
 }
 
 /**
- * Use `number.Show` instead.
+ * Use [`Show`](./number.ts.html#Show) instead.
  *
  * @category instances
  * @since 2.0.0
diff --git a/src/State.ts b/src/State.ts
index 38891ee9..f5c122ea 100644
--- a/src/State.ts
+++ b/src/State.ts
@@ -346,7 +346,7 @@ export const sequenceArray: <S, A>(arr: ReadonlyArray<State<S, A>>) => State<S,
 // -------------------------------------------------------------------------------------
 
 /**
- * Use `evaluate` instead
+ * Use [`evaluate`](#evaluate) instead
  *
  * @since 2.0.0
  * @deprecated
@@ -354,7 +354,7 @@ export const sequenceArray: <S, A>(arr: ReadonlyArray<State<S, A>>) => State<S,
 export const evalState: <S, A>(ma: State<S, A>, s: S) => A = (ma, s) => ma(s)[0]
 
 /**
- * Use `execute` instead
+ * Use [`execute`](#execute) instead
  *
  * @since 2.0.0
  * @deprecated
diff --git a/src/StateReaderTaskEither.ts b/src/StateReaderTaskEither.ts
index e7af280b..bc4472a6 100644
--- a/src/StateReaderTaskEither.ts
+++ b/src/StateReaderTaskEither.ts
@@ -245,7 +245,7 @@ export const fromIOEitherK = <E, A extends ReadonlyArray<unknown>, B>(
 ): (<S, R>(...a: A) => StateReaderTaskEither<S, R, E, B>) => (...a) => fromIOEither(f(...a))
 
 /**
- * Less strict version of [`chainIOEitherK`](#chainIOEitherK).
+ * Less strict version of [`chainIOEitherK`](#chainioeitherk).
  *
  * @category combinators
  * @since 2.6.1
@@ -271,7 +271,7 @@ export const fromTaskEitherK = <E, A extends ReadonlyArray<unknown>, B>(
 ): (<S, R>(...a: A) => StateReaderTaskEither<S, R, E, B>) => (...a) => fromTaskEither(f(...a))
 
 /**
- * Less strict version of [`chainTaskEitherK`](#chainTaskEitherK).
+ * Less strict version of [`chainTaskEitherK`](#chaintaskeitherk).
  *
  * @category combinators
  * @since 2.6.1
@@ -299,7 +299,7 @@ export function fromReaderTaskEitherK<R, E, A extends ReadonlyArray<unknown>, B>
 }
 
 /**
- * Less strict version of [`chainReaderTaskEitherK`](#chainReaderTaskEitherK).
+ * Less strict version of [`chainReaderTaskEitherK`](#chainreadertaskeitherk).
  *
  * @category combinators
  * @since 2.6.1
@@ -461,7 +461,7 @@ export const flatten: <S, R, E, A>(
  */
 export const altW = <S, R2, E2, B>(that: () => StateReaderTaskEither<S, R2, E2, B>) => <R1, E1, A>(
   fa: StateReaderTaskEither<S, R1, E1, A>
-): StateReaderTaskEither<S, R1 & R2, E1 | E2, A | B> => (r) =>
+): StateReaderTaskEither<S, R1 & R2, E2, A | B> => (r) =>
   pipe(
     fa(r),
     RTE.altW(() => that()(r))
@@ -658,7 +658,7 @@ export const chainFirst: <S, R, E, A, B>(
   chainFirst_(Chain)
 
 /**
- * Less strict version of [`chainFirst`](#chainFirst).
+ * Less strict version of [`chainFirst`](#chainfirst).
  *
  * Derivable from `Chain`.
  *
@@ -735,7 +735,7 @@ export const chainEitherK: <E, A, B>(
   chainEitherK_(FromEither, Chain)
 
 /**
- * Less strict version of [`chainEitherK`](#chainEitherK).
+ * Less strict version of [`chainEitherK`](#chaineitherk).
  *
  * @category combinators
  * @since 2.6.1
@@ -773,7 +773,7 @@ export const filterOrElse: {
   filterOrElse_(FromEither, Chain)
 
 /**
- * Less strict version of [`filterOrElse`](#filterOrElse).
+ * Less strict version of [`filterOrElse`](#filterorelse).
  *
  * @category combinators
  * @since 2.9.0
@@ -965,7 +965,7 @@ export const traverseArrayWithIndex = <S, R, E, A, B>(
           : f(
               i,
               a
-            )(s)(r)().then((eb) => {
+            )(ebs.right[1])(r)().then((eb) => {
               if (E.isLeft(eb)) {
                 return eb
               }
@@ -1049,7 +1049,7 @@ export const stateReaderTaskEitherSeq: typeof stateReaderTaskEither = {
 }
 
 /**
- * Use `evaluate` instead
+ * Use [`evaluate`](#evaluate) instead
  *
  * @since 2.0.0
  * @deprecated
@@ -1065,7 +1065,7 @@ export const evalState: <S, R, E, A>(ma: StateReaderTaskEither<S, R, E, A>, s: S
   )
 
 /**
- * Use `execute` instead
+ * Use [`execute`](#execute) instead
  *
  * @since 2.0.0
  * @deprecated
diff --git a/src/Strong.ts b/src/Strong.ts
index 95d66f09..2465c682 100644
--- a/src/Strong.ts
+++ b/src/Strong.ts
@@ -161,7 +161,7 @@ export function fanOut<F>(
 // -------------------------------------------------------------------------------------
 
 /**
- * Use `split` instead.
+ * Use [`split`](#split) instead.
  *
  * @since 2.0.0
  * @deprecated
@@ -188,7 +188,7 @@ export function splitStrong<F>(
 }
 
 /**
- * Use `fanOut` instead.
+ * Use [`fanOut`](#fanout) instead.
  *
  * @since 2.0.0
  * @deprecated
diff --git a/src/Task.ts b/src/Task.ts
index c2c018de..e86d6433 100644
--- a/src/Task.ts
+++ b/src/Task.ts
@@ -563,7 +563,7 @@ export const taskSeq: typeof task = {
 }
 
 /**
- * Use `Apply.getApplySemigroup` instead.
+ * Use [`getApplySemigroup`](./Apply.ts.html#getApplySemigroup) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -574,7 +574,7 @@ export const getSemigroup: <A>(S: Semigroup<A>) => Semigroup<Task<A>> =
   getApplySemigroup_(ApplySeq)
 
 /**
- * Use `Applicative.getApplicativeMonoid` instead.
+ * Use [`getApplicativeMonoid`](./Applicative.ts.html#getApplicativeMonoid) instead.
  *
  * Lift a monoid into 'Task', the inner values are concatenated using the provided `Monoid`.
  *
diff --git a/src/TaskEither.ts b/src/TaskEither.ts
index 718acbcf..55ed1bd5 100644
--- a/src/TaskEither.ts
+++ b/src/TaskEither.ts
@@ -186,7 +186,7 @@ export const matchE: <E, A, B>(
   ET.matchE(T.Monad)
 
 /**
- * Alias of [`matchE`](#matchE).
+ * Alias of [`matchE`](#matche).
  *
  * @category destructors
  * @since 2.0.0
@@ -194,7 +194,7 @@ export const matchE: <E, A, B>(
 export const fold = matchE
 
 /**
- * Less strict version of [`matchE`](#matchE).
+ * Less strict version of [`matchE`](#matche).
  *
  * @category destructors
  * @since 2.10.0
@@ -205,7 +205,7 @@ export const matchEW: <E, B, A, C>(
 ) => (ma: TaskEither<E, A>) => Task<B | C> = matchE as any
 
 /**
- * Alias of [`matchEW`](#matchEW).
+ * Alias of [`matchEW`](#matchew).
  *
  * @category destructors
  * @since 2.10.0
@@ -221,7 +221,7 @@ export const getOrElse: <E, A>(onLeft: (e: E) => Task<A>) => (ma: TaskEither<E,
   ET.getOrElse(T.Monad)
 
 /**
- * Less strict version of [`getOrElse`](#getOrElse).
+ * Less strict version of [`getOrElse`](#getorelse).
  *
  * @category destructors
  * @since 2.6.0
@@ -239,7 +239,7 @@ export const getOrElseW: <E, B>(
  *
  * Note: `f` should never `throw` errors, they are not caught.
  *
- * See also [`tryCatchK`](#tryCatchK).
+ * See also [`tryCatchK`](#trycatchk).
  *
  * @example
  * import { left, right } from 'fp-ts/Either'
@@ -307,7 +307,7 @@ export const orElse: <E1, A, E2>(onLeft: (e: E1) => TaskEither<E2, A>) => (ma: T
   ET.orElse(T.Monad)
 
 /**
- * Less strict version of [`orElse`](#orElse).
+ * Less strict version of [`orElse`](#orelse).
  *
  * @category combinators
  * @since 2.10.0
@@ -333,7 +333,7 @@ export const fromIOEitherK = <E, A extends ReadonlyArray<unknown>, B>(
 ): ((...a: A) => TaskEither<E, B>) => flow(f, fromIOEither)
 
 /**
- * Less strict version of [`chainIOEitherK`](#chainIOEitherK).
+ * Less strict version of [`chainIOEitherK`](#chainioeitherk).
  *
  * @category combinators
  * @since 2.6.1
@@ -461,7 +461,7 @@ export const flatten: <E, A>(mma: TaskEither<E, TaskEither<E, A>>) => TaskEither
  *
  * In case of `TaskEither` returns `fa` if is a `Right` or the value returned by `that` otherwise.
  *
- * See also [orElse](#orElse).
+ * See also [orElse](#orelse).
  *
  * @example
  * import * as E from 'fp-ts/Either'
@@ -509,7 +509,7 @@ export const alt: <E, A>(that: Lazy<TaskEither<E, A>>) => (fa: TaskEither<E, A>)
  */
 export const altW: <E2, B>(
   that: Lazy<TaskEither<E2, B>>
-) => <E1, A>(fa: TaskEither<E1, A>) => TaskEither<E1 | E2, A | B> = alt as any
+) => <E1, A>(fa: TaskEither<E1, A>) => TaskEither<E2, A | B> = alt as any
 
 /**
  * @category Pointed
@@ -784,7 +784,7 @@ export const chainFirst: <E, A, B>(f: (a: A) => TaskEither<E, B>) => (ma: TaskEi
   chainFirst_(Chain)
 
 /**
- * Less strict version of [`chainFirst`](#chainFirst).
+ * Less strict version of [`chainFirst`](#chainfirst).
  *
  * Derivable from `Chain`.
  *
@@ -857,7 +857,7 @@ export const chainEitherK: <E, A, B>(f: (a: A) => E.Either<E, B>) => (ma: TaskEi
   chainEitherK_(FromEither, Chain)
 
 /**
- * Less strict version of [`chainEitherK`](#chainEitherK).
+ * Less strict version of [`chainEitherK`](#chaineitherk).
  *
  * @category combinators
  * @since 2.6.1
@@ -889,7 +889,7 @@ export const filterOrElse: {
   filterOrElse_(FromEither, Chain)
 
 /**
- * Less strict version of [`filterOrElse`](#filterOrElse).
+ * Less strict version of [`filterOrElse`](#filterorelse).
  *
  * @category combinators
  * @since 2.9.0
@@ -1244,10 +1244,7 @@ export const taskEitherSeq: typeof taskEither = {
 }
 
 /**
- * Use `Apply.getApplySemigroup` instead.
- *
- * Semigroup returning the left-most `Left` value. If both operands are `Right`s then the inner values
- * are concatenated using the provided `Semigroup`
+ * Use [`getApplySemigroup`](./Apply.ts.html#getApplySemigroup) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -1258,7 +1255,7 @@ export const getApplySemigroup: <E, A>(S: Semigroup<A>) => Semigroup<TaskEither<
   getApplySemigroup_(ApplySeq)
 
 /**
- * Use `Applicative.getApplicativeMonoid` instead.
+ * Use [`getApplicativeMonoid`](./Applicative.ts.html#getApplicativeMonoid) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -1269,10 +1266,7 @@ export const getApplyMonoid: <E, A>(M: Monoid<A>) => Monoid<TaskEither<E, A>> =
   getApplicativeMonoid(ApplicativeSeq)
 
 /**
- * Use `Apply.getApplySemigroup` instead.
- *
- * Semigroup returning the left-most non-`Left` value. If both operands are `Right`s then the inner values are
- * concatenated using the provided `Semigroup`
+ * Use [`getApplySemigroup`](./Apply.ts.html#getApplySemigroup) instead.
  *
  * @category instances
  * @since 2.0.0
@@ -1282,7 +1276,7 @@ export const getSemigroup = <E, A>(S: Semigroup<A>): Semigroup<TaskEither<E, A>>
   getApplySemigroup_(T.ApplySeq)(E.getSemigroup(S))
 
 /**
- * Use `getApplicativeTaskValidation` and `getAltTaskValidation` instead.
+ * Use [`getApplicativeTaskValidation`](#getapplicativetaskvalidation) and [`getAltTaskValidation`](#getalttaskvalidation) instead.
  *
  * @category instances
  * @since 2.0.0
diff --git a/src/TaskOption.ts b/src/TaskOption.ts
index 1e1e567c..59ee088d 100644
--- a/src/TaskOption.ts
+++ b/src/TaskOption.ts
@@ -129,7 +129,7 @@ export const matchE: <B, A>(onNone: () => Task<B>, onSome: (a: A) => Task<B>) =>
   OT.matchE(T.Chain)
 
 /**
- * Alias of [`matchE`](#matchE).
+ * Alias of [`matchE`](#matche).
  *
  * @category destructors
  * @since 2.10.0
@@ -137,7 +137,7 @@ export const matchE: <B, A>(onNone: () => Task<B>, onSome: (a: A) => Task<B>) =>
 export const fold = matchE
 
 /**
- * Less strict version of [`matchE`](#matchE).
+ * Less strict version of [`matchE`](#matche).
  *
  * @category destructors
  * @since 2.10.0
@@ -148,7 +148,7 @@ export const matchEW: <B, C, A>(
 ) => (ma: TaskOption<A>) => Task<B | C> = matchE as any
 
 /**
- * Alias of [`matchEW`](#matchEW).
+ * Alias of [`matchEW`](#matchew).
  *
  * @category destructors
  * @since 2.10.0
@@ -164,7 +164,7 @@ export const getOrElse: <A>(onNone: Lazy<Task<A>>) => (fa: TaskOption<A>) => Tas
   OT.getOrElse(T.Monad)
 
 /**
- * Less strict version of [`getOrElse`](#getOrElse).
+ * Less strict version of [`getOrElse`](#getorelse).
  *
  * @category destructors
  * @since 2.10.0
@@ -188,7 +188,7 @@ export const fromNullable: <A>(a: A) => TaskOption<NonNullable<A>> =
  *
  * Note: `f` should never `throw` errors, they are not caught.
  *
- * See also [`tryCatchK`](#tryCatchK).
+ * See also [`tryCatchK`](#trycatchk).
  *
  * @category interop
  * @since 2.10.0
diff --git a/src/TaskThese.ts b/src/TaskThese.ts
index e4d80a4b..53075a6f 100644
--- a/src/TaskThese.ts
+++ b/src/TaskThese.ts
@@ -161,7 +161,7 @@ export const matchE: <E, B, A>(
   TT.matchE(T.Monad)
 
 /**
- * Alias of [`matchE`](#matchE).
+ * Alias of [`matchE`](#matche).
  *
  * @category destructors
  * @since 2.4.0
@@ -169,7 +169,7 @@ export const matchE: <E, B, A>(
 export const fold = matchE
 
 /**
- * Less strict version of [`matchE`](#matchE).
+ * Less strict version of [`matchE`](#matche).
  *
  * @category destructors
  * @since 2.10.0
@@ -181,7 +181,7 @@ export const matchEW: <E, B, A, C, D>(
 ) => (fa: TaskThese<E, A>) => Task<B | C | D> = fold as any
 
 /**
- * Alias of [`matchEW`](#matchEW).
+ * Alias of [`matchEW`](#matchew).
  *
  * @category destructors
  * @since 2.10.0
@@ -459,7 +459,7 @@ export const toTuple2: <E, A>(e: Lazy<E>, a: Lazy<A>) => (fa: TaskThese<E, A>) =
 // -------------------------------------------------------------------------------------
 
 /**
- * Use `Functor` instead.
+ * Use [`Functor`](#functor) instead.
  *
  * @category instances
  * @since 2.7.0
@@ -471,7 +471,7 @@ export const functorTaskThese: Functor2<URI> = {
 }
 
 /**
- * Use `Bifunctor` instead.
+ * Use [`Bifunctor`](#bifunctor) instead.
  *
  * @category instances
  * @since 2.7.0
@@ -484,7 +484,7 @@ export const bifunctorTaskThese: Bifunctor2<URI> = {
 }
 
 /**
- * Use `toTuple2` instead.
+ * Use [`toTuple2`](#totuple2) instead.
  *
  * @since 2.4.0
  * @deprecated
@@ -510,7 +510,7 @@ export const taskThese: Functor2<URI> & Bifunctor2<URI> = {
 }
 
 /**
- * Use `Apply.getApplySemigroup` instead.
+ * Use [`getApplySemigroup`](./Apply.ts.html#getApplySemigroup) instead.
  *
  * @category instances
  * @since 2.4.0
diff --git a/src/These.ts b/src/These.ts
index 8c5306e4..edcae583 100644
--- a/src/These.ts
+++ b/src/These.ts
@@ -103,7 +103,7 @@ export const matchW = <E, B, A, C, D>(onLeft: (e: E) => B, onRight: (a: A) => C,
 }
 
 /**
- * Alias of [`matchW`](#matchW).
+ * Alias of [`matchW`](#matchw).
  *
  * @category destructors
  * @since 2.10.0
@@ -673,7 +673,7 @@ export const toTuple2 = <E, A>(e: Lazy<E>, a: Lazy<A>) => (fa: These<E, A>): rea
 // -------------------------------------------------------------------------------------
 
 /**
- * Use `toTuple2` instead.
+ * Use [`toTuple2`](#totuple2) instead.
  *
  * @since 2.0.0
  * @deprecated
diff --git a/src/Traced.ts b/src/Traced.ts
index 1b9b3039..5d56fc9d 100644
--- a/src/Traced.ts
+++ b/src/Traced.ts
@@ -143,7 +143,7 @@ export const flap =
 // -------------------------------------------------------------------------------------
 
 /**
- * Use `Functor` instead.
+ * Use [`Functor`](#functor) instead.
  *
  * @category instances
  * @since 2.0.0
diff --git a/src/Traversable.ts b/src/Traversable.ts
index dc44b823..bbfb9022 100644
--- a/src/Traversable.ts
+++ b/src/Traversable.ts
@@ -520,7 +520,11 @@ export interface TraversableComposition11<F extends URIS, G extends URIS>
 }
 
 /**
- * Returns the composition of two traversables
+ * Use
+ * - [`traverse`](#traverse)
+ * - [`sequence`](#sequence)
+ *
+ * instead.
  *
  * @since 2.0.0
  * @deprecated
diff --git a/src/Tuple.ts b/src/Tuple.ts
index dbe382b5..bdb88ded 100644
--- a/src/Tuple.ts
+++ b/src/Tuple.ts
@@ -364,7 +364,7 @@ export const Traversable: Traversable2<URI> = {
 // -------------------------------------------------------------------------------------
 
 /**
- * Use `mapFst` instead.
+ * Use [`mapFst`](#mapfst) instead.
  *
  * @since 2.0.0
  * @deprecated
@@ -372,7 +372,7 @@ export const Traversable: Traversable2<URI> = {
 export const map: <A, B>(f: (a: A) => B) => <E>(fa: [A, E]) => [B, E] = mapFst
 
 /**
- * Use `mapSnd` instead.
+ * Use [`mapSnd`](#mapsnd) instead.
  *
  * @since 2.0.0
  * @deprecated
diff --git a/src/Writer.ts b/src/Writer.ts
index e253954f..f5f4c103 100644
--- a/src/Writer.ts
+++ b/src/Writer.ts
@@ -239,7 +239,7 @@ export const execute: <W, A>(fa: Writer<W, A>) => W = (fa) => fa()[1]
 // -------------------------------------------------------------------------------------
 
 /**
- * Use `evaluate` instead
+ * Use [`evaluate`](#evaluate) instead
  *
  * @since 2.0.0
  * @deprecated
@@ -247,7 +247,7 @@ export const execute: <W, A>(fa: Writer<W, A>) => W = (fa) => fa()[1]
 export const evalWriter: <W, A>(fa: Writer<W, A>) => A = (fa) => fa()[0]
 
 /**
- * Use `execute` instead
+ * Use [`execute`](#execute) instead
  *
  * @since 2.0.0
  * @deprecated
@@ -255,7 +255,7 @@ export const evalWriter: <W, A>(fa: Writer<W, A>) => A = (fa) => fa()[0]
 export const execWriter: <W, A>(fa: Writer<W, A>) => W = (fa) => fa()[1]
 
 /**
- * Use `Functor` instead.
+ * Use [`Functor`](#functor) instead.
  *
  * @category instances
  * @since 2.0.0
diff --git a/src/boolean.ts b/src/boolean.ts
index 63b4c4b9..7b22a440 100644
--- a/src/boolean.ts
+++ b/src/boolean.ts
@@ -23,7 +23,7 @@ export const matchW = <A, B>(onFalse: Lazy<A>, onTrue: Lazy<B>) => (value: boole
   value ? onTrue() : onFalse()
 
 /**
- * Alias of [`matchW`](#matchW).
+ * Alias of [`matchW`](#matchw).
  *
  * @category destructors
  * @since 2.10.0
diff --git a/src/internal.ts b/src/internal.ts
index c923ad7a..61c4fbbd 100644
--- a/src/internal.ts
+++ b/src/internal.ts
@@ -25,7 +25,7 @@ export const isLeft = <E, A>(ma: Either<E, A>): ma is Left<E> => ma._tag === 'Le
 // -------------------------------------------------------------------------------------
 
 /** @internal */
-export const hasOwnProperty = Object.prototype.hasOwnProperty
+export const has = Object.prototype.hasOwnProperty
 
 // -------------------------------------------------------------------------------------
 // NonEmptyArray


Test patch:
diff --git a/test/StateReaderTaskEither.ts b/test/StateReaderTaskEither.ts
index 10ee5938..03797904 100644
--- a/test/StateReaderTaskEither.ts
+++ b/test/StateReaderTaskEither.ts
@@ -1,7 +1,7 @@
 import * as assert from 'assert'
 import * as A from '../src/Array'
 import * as E from '../src/Either'
-import { pipe } from '../src/function'
+import { pipe, tuple } from '../src/function'
 import * as I from '../src/IO'
 import * as IE from '../src/IOEither'
 import * as O from '../src/Option'
@@ -355,4 +355,17 @@ describe('StateReaderTaskEither', () => {
     const e = await pipe(_.fromState(s), _.evaluate(state))({})()
     U.deepStrictEqual(e, E.right(1))
   })
+
+  it('#1486', async () => {
+    const append = (n: number): _.StateReaderTaskEither<ReadonlyArray<number>, {}, Error, void> =>
+      _.modify((a) => [...a, n])
+    U.deepStrictEqual(
+      await pipe(
+        [1, 2, 3],
+        _.traverseArray(append),
+        _.map(() => undefined)
+      )([])({})(),
+      E.right(tuple(undefined, [1, 2, 3]))
+    )
+  })
 })