Skip to content

Instantly share code, notes, and snippets.

@ahoy-jon
Forked from fsarradin/Point.scala
Last active December 19, 2015 04:49
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ahoy-jon/5899639 to your computer and use it in GitHub Desktop.
Save ahoy-jon/5899639 to your computer and use it in GitHub Desktop.
object Point extends App {
trait Semigroup[T] {
def append(p1: T, p2: T): T
}
case class Point2D(x: Int, y: Int)
case class Point3D(x: Int, y: Int, z: Int)
object Point2D {
implicit def toPoint3D(p:Point2D):Point3D = Point3D(p.x,p.y,0)
}
implicit object Point2DAdder extends Semigroup[Point2D] {
def append(p1: Point2D, p2: Point2D): Point2D = Point2D(p1.x + p2.x, p1.y + p2.y)
}
implicit object Point3DAdder extends Semigroup[Point3D] {
def append(p1: Point3D, p2: Point3D): Point3D = Point3D(p1.x + p2.x, p1.y + p2.y, p1.z + p2.z)
}
case class addWrapper[T:Semigroup](w:T) {
def add(t:T):T = implicitly[Semigroup[T]].append(w, t)
}
implicit def toAddWrapper[T:Semigroup](t:T) = addWrapper(t)
val point1 = Point2D(1, 2)
val point2 = Point3D(1, 2, 3)
println(point2.add(point1))
}
@evantill
Copy link

evantill commented Jul 1, 2013

mais println(point1.add(point2)) ne marchera pas non ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment