I'm learning to use Scala cats library. Quite often I see this type of definition like
implicit def validatedApplicative[E : Semigroup]: Applicative[Validated[E, ?]] = ???
def parallelValidate[E : Semigroup, A, B, C](v1: Validated[E, A], v2: Validated[E, B])(f: (A, B) => C): Validated[E, C] = ???
def parse[A : Read](key: String): Validated[ConfigError, A] = ???
Can someone tell me why we are defining the
A
is of typeClassName
in generics for[A : ClassName]
?What additional benefit we get when we write a method definition as
def parse[A : Read](key: String): Validated[ConfigError, A]
instead of
def parse(key: String): Validated[ConfigError, Read]
for a method declaration?