您好我正在尋找一個在Scala中類型類用法的快速示例,它可以在2.7.7和2.8環境中使用。尋找將在斯卡拉2.7.7和2.8腳本中工作的類型類用法的示例
我見過的所有例子只能在2.8中工作,但我被告知類型類也可以在2.7.7中實現。
唯一的另一個要求是使用必須能夠在腳本中工作。
任何示例讚賞!由於
您好我正在尋找一個在Scala中類型類用法的快速示例,它可以在2.7.7和2.8環境中使用。尋找將在斯卡拉2.7.7和2.8腳本中工作的類型類用法的示例
我見過的所有例子只能在2.8中工作,但我被告知類型類也可以在2.7.7中實現。
唯一的另一個要求是使用必須能夠在腳本中工作。
任何示例讚賞!由於
我去沿着這些路線的解決方案:
//---------- Classes without needed behavior
case class Point(x: Double, y: Double)
trait Shape {}
case class Circle(center: Point, radius: Double) extends Shape {}
case class Rectangle(lowerLeft: Point, upperRight: Point) extends Shape {}
val circle = Circle(Point(1.0, 2.0), 5.0)
val rectangle = Rectangle(Point(-2.0, -1.0), Point(4.0, 5.0))
//----------- Support for new behavior I want to add
// Create exception to handle non supported subclasses
case class NewMethodNotSupported(a: Any)
extends RuntimeException(a.toString + ".newMethod() not supported")
class NewBehavior(shape: Shape) {
def newMethod() = shape match {
case c: Circle => doMethod(c)
case r: Rectangle => doMethod(r)
case _ => throw NewMethodNotSupported(shape)
}
private
def doMethod(s: Shape) = println(s) // print to standard out.
}
object NewBehavior {
// invoked by the compiler
implicit def shapeToNewBehavior(s: Shape) = new NewBehavior(s)
}
// bring the implicit method in scope
import NewBehavior._
// --------- End of new behavior support
// Test behavior support:
println("Test that new behavior is added:")
circle.newMethod()
rectangle.newMethod()
// Create a non supported shape class
case class Triangle(vertex1: Point,
vertex2: Point, vertex3: Point) extends Shape {}
val triangle = Triangle(Point(-1.0,0.0), Point(1.0,0.0), Point(0.0,1.0))
// Catch exception thrown by trying to call method from unsupported shape
try{
println("\nTest method call from unsupported shape:")
triangle.newMethod()
} catch {
case dns: NewMethodNotSupported => println(dns); System.exit(-1)
case unknown => println("Uknown exception " + unknown); System.exit(-1)
}
我想你可以做這樣的事情:
def max[A](list: List[A])(implicit ord: Ordering[A]): A = {
list.tail.foldLeft(list.head) ((a, b) => if (ord.lt(a, b)) b else a)
}
implicit def toOrdering[A <% Ordered[A]]: Ordering[A] = new Ordering[A] {
def compare(a: A, b: A): Int = (a < b, b < a) match {
case (true, _) => -1
case (_, true) => 1
case _ => 0
}
}
println(max(List(1, 2, 3, 2, 1)))
的代碼運行在兩斯卡拉2.7.7和2.8.0(經測試,現在在這兩個),儘管隱含的定義是不必要的(和在某些情況下可能有害)在Scala 2.8中。
我目前並不熟悉查看邊界,所以我無法弄清楚如何工作,你的解決方案,但我想通了,該怎麼辦呢其他方式。 – klactose 2010-12-15 06:46:53
這不符合類型模式。 – 2010-12-15 10:47:50