Skip to content

Instantly share code, notes, and snippets.

@venil7
Last active August 29, 2022 03:19
Reader Monad in TypeScript
class ReaderMonad<A, B> {
constructor(public runReader: (a: A) => B) {
}
bind<C>(func: (b: B) => ReaderMonad<A, C>): ReaderMonad<A, C> {
return new ReaderMonad<A, C>((a: A) => {
const b = this.runReader(a);
return func(b).runReader(a);
});
}
static return<A, B>(b: B): ReaderMonad<A, B> {
return new ReaderMonad((a: A) => b);
}
}
const uppercase = new ReaderMonad((s: string) =>
s.toUpperCase())
const reverse = new ReaderMonad((s: string) =>
s.split('').reverse().join(''));
const reader = uppercase
.bind(s1 => reverse
.bind(s2 => ReaderMonad.return([s1, s2])));
const result = reader.runReader("hello"); //["HELLO", "olleh"]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment