data class Point2D data class Cords (val x: Int, val y: Int) Isomorphism (val x: Int, val y: Int) fun point2DToCords (point2D: Point2D): Cords { return Cords(point2D.x, point2D.y) }
data class Point2D data class Cords (val x: Int, val y: Int) Isomorphism (val x: Int, val y: Int) fun cordsToPoint2D (cord: Cord): Point2D { return Point2D(cord.x, cord.y) }
Lens data class Person(val name: String, val age: Int) val personNameLens : Lens = Lens( get = { person !-> person.name }, set = { newName !-> {foo !-> foo.copy(name = newName)} } )
Lens data class Employee(val name: String, val company: Company) data class Company(val name: String, val address: Address) data class Address(val city: String, val street: Street) data class Street(val number: Int, val name: String)
Lens val street = Street(1, "hacker Way”) val address = Address("Menlo Park, CA", street) val company = Company("Facebook", address) val employee = Employee("John Doe", company)
val company: Company) Lens data class Employee(val name: String, val company: Company) val employeeCompany: Lens = Lens(get = { it.company }, set = { company !-> { employee !-> employee.copy(company = company) } } )
data class Company(val name: String, val address: Address) Lens val companyAddress: Lens = Lens( get = { it.address }, set = { address !-> { company !-> company.copy(address = address) } }) val address: Address)
data class Address(val city: String, val street: Street) Lens val addressStreet: Lens = Lens( get = { it.street }, set = { street !-> { address !-> address.copy(street = street) } }) val street: Street)
data class Street(val number: Int, val name: String) Lens val streetName: Lens = Lens( get = { it.name }, set = { name !-> { street !-> street.copy(name = name) } } ) val name: String)
Ad-hoc Polymorphism with Type Class inline fun combineAll( a: F, b: F, ev: Monoid = monoidal() ): F { return ev.combine(a, b) } • Polymorphism with Type Classes.
Define Instances of Type Class val monoidMap = mutableMapOf, Monoid"<*">>() monoidMap[String"::class.java] = object: Monoid { override fun combine(a: String, b: String): String { return a + b } }
Define Instances of Type Class val monoidMap = mutableMapOf, Monoid"<*">>() monoidMap[Matrix"::class.java] = object: Monoid { override fun combine(a: Matrix, b: Matrix): Matrix { return addMatricies(a, b) } }
Getting Instances of Type Class val monoidMap = mutableMapOf, Monoid"<*">>() inline fun monoidal(): Monoid { return monoidMap[F"::class.java] as Monoid }
Ad-hoc Polymorphism with Type Class inline fun combineAll( a: F, b: F, ev: Monoid = monoidal() ): F { return ev.combine(a, b) } combineAll(matrix, matrix) combineAll("Hello", "World")
Type Classes Proposal import intext.IntMonoid fun add(a: A, b: A): A given Monoid = a.combine(b) add(1, 1) "// compiles add("a", "b") "// does not compile: No `String: Monoid`