pakoito
05/16/2018, 4:36 PMpakoito
05/16/2018, 4:36 PMpakoito
05/16/2018, 4:37 PMpakoito
05/16/2018, 4:42 PMpakoito
05/16/2018, 4:42 PMpakoito
05/16/2018, 4:43 PMpakoito
05/16/2018, 4:43 PMAedan Smith
05/16/2018, 11:04 PMpakoito
05/16/2018, 11:49 PMpakoito
05/16/2018, 11:49 PMpakoito
05/16/2018, 11:49 PMsimon.vergauwen
05/17/2018, 8:02 AMpakoito
05/17/2018, 11:18 AMpakoito
05/17/2018, 11:18 AMsmilecs
05/17/2018, 2:28 PMAedan Smith
05/17/2018, 6:53 PMraulraja
05/17/2018, 10:03 PMsimon.vergauwen
05/18/2018, 6:49 AMjacob
05/21/2018, 11:24 AMraulraja
05/21/2018, 11:32 AM// type class
interface Monoid<A> {
fun A.combine(b: A): A
val empty: A
}
// instance
extension object IntMonoid : Monoid<Int> {
fun Int.combine(b: Int): Int = this + b
val empty: Int = 0
}
// polimorphic function or class that depends on `Monoid`
fun <A> add(a: A, b: A, with Monoid<A>): A = a.combine(b)
add(1, 1) // compiles
add("a", "b") // does not compile: No `Monoid<String>` instance defined in scope
add
may desugar to:
fun <A> add(a: A, b: A, $ev: Monoid<A>): A = $ev.run { a.combine(b) }
jacob
05/21/2018, 11:35 AMjacob
05/21/2018, 11:35 AMraulraja
05/21/2018, 11:35 AMjacob
05/21/2018, 11:35 AMraulraja
05/21/2018, 11:35 AMIntMonoid
at the final edge or concretion call site then it is available otherwise fails to compile.raulraja
05/21/2018, 11:36 AMwith
to methods they use the type class.raulraja
05/21/2018, 11:36 AMraulraja
05/21/2018, 11:37 AMfun <A> Monoid<A>.add(a: A, b: A): A = a.combine(b)