2010-09-24 3 views

Antwort

9

nicht wirklich möglich, wie Sie es nennen, aber Sie können es tun, um die Typklasse Muster. Zum Beispiel von here:

sealed abstract class Acceptable[T] 
object Acceptable { 
    implicit object IntOk extends Acceptable[Int] 
    implicit object LongOk extends Acceptable[Long] 
} 

def f[T: Acceptable](t: T) = t 

scala> f(1) 
res0: Int = 1 

scala> f(1L) 
res1: Long = 1 

scala> f(1.0) 
<console>:8: error: could not find implicit value for parameter ev: Acceptable[Double] 
f(1.0) 
^ 

EDIT

Dies funktioniert, wenn Klasse und Objekt sind Begleiter. Wenn Sie bei REPL auf eine andere Zeile tippen (dh ein "Ergebnis" zwischen ihnen erscheint), sind sie keine Begleitpersonen. Sie können es wie unten geben, aber:

scala> sealed abstract class Acceptable[T]; object Acceptable { 
    | implicit object IntOk extends Acceptable[Int] 
    | implicit object LongOk extends Acceptable[Long] 
    | } 
defined class Acceptable 
defined module Acceptable 
+0

Danke, verweisen auch http://ropas.snu.ac.kr/~bruno/papers/TypeClasses.pdf – oluies

+1

@Brent Wie ich per E-Mail gesagt habe, ist dies wahrscheinlich ein Ergebnis der Eingabe der Klasse ein Objekt in verschiedenen Zeilen. Siehe meine Bearbeitung. –

5

Sie könnten ein wenig Kilometer vom Typ Beide erhalten. Die Entweder-Hierarchie ist jedoch versiegelt und die Handhabung von mehr als zwei Typen wird mühsam.

scala> implicit def string2either(s: String) = Left(s) 
string2either: (s: String)Left[String,Nothing] 

scala> implicit def int2either(i: Int) = Right(i) 
int2either: (i: Int)Right[Nothing,Int] 

scala> type SorI = Either[String, Int] 
defined type alias SorI 

scala> def foo(a: SorI) {a match { 
    |  case Left(v) => println("Got a "+v) 
    |  case Right(v) => println("Got a "+v) 
    | } 
    | } 
foo: (a: SorI)Unit 

scala> def bar(a: List[SorI]) { 
    | a foreach foo 
    | } 
bar: (a: List[SorI])Unit 

scala> 

scala> foo("Hello") 
Got a Hello 

scala> foo(10) 
Got a 10 

scala> bar(List(99, "beer")) 
Got a 99 
Got a beer 
2

Eine andere Lösung ist Wrapper-Klassen:

case class IntList(l:List[Int]) 
case class StringList(l:List[String]) 

implicit def li2il(l:List[Int]) = IntList(l) 
implicit def ls2sl(l:List[String]) = StringList(l) 

def foo(list:IntList) = { println("Int-List " + list.l)} 
def foo(list:StringList) = { println("String-List " + list.l)}