gcanti / fp-ts

Functional programming in TypeScript

Home Page:https://gcanti.github.io/fp-ts/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Document how to make working with abstractions ergonomic

aloussase opened this issue · comments

When I want to abstract over the type of Monad (for example when using tagless final) I end up having to write code like this:

export const register = <F extends URIS>(F: UserSymmantics<F> & MonadTask1<F>) => (username: string, password: string) => {
  const flatMap = <A, B>(f: (a: A) => Kind<F, B>) => (ma: Kind<F, A>): Kind<F, B> => F.chain(ma, f)
  return pipe(
    F.fromTask(() => hash(password, 10)),
    flatMap(hashedPassword => F.createUser(username, hashedPassword)),
  )
}

Which is not too bad, but I'd prefer not to write the flatMap function. I'm basing this on the fp to the max example from the repository. Isn't there a more ergonomic way of writing code like this?

Thank you very much.