, , , .
1.
:
case class GreaterThan[T <% Ordered[T]]( a:Expr[T], b:Expr[T]) extends Expr[Boolean]
case class GreaterThan[T : Ordering]( a:Expr[T], b:Expr[T]) extends Expr[Boolean]
:
case class GreaterThan[T]( a:Expr[T], b:Expr[T])(implicit evidence: T => Ordered[T]) extends Expr[Boolean]
case class GreaterThan[T]( a:Expr[T], b:Expr[T])(implicit ordering: Ordering[T]) extends Expr[Boolean]
case , Ordering. match > Ordered[T].
2.
Erasure
:
case GreaterThan(a,b) => execute(a) > execute(b)
, Expr GreaterThan, - , GreaterThan. , , - . Ordered T => Ordered[T] GreaterThan . execute, T => Ordered[T] .
3.
, GreaterThan. :
case class GreaterThan[T]( a:Expr[T], b:Expr[T])(implicit val ordering: Ordering[T]) extends Expr[Boolean]
val Ordering .
match:
case gt: GreaterThan[_] => gt.ordering.gt(execute(gt.a), execute(gt.b))
, GreaterThan , , Ordering , .
Haskell , , , . Scala, .
, Haskell.