2013-11-21 13 views
5

と境界、私は、コンテキスト境界を使用することができます。コンテキストScalaで一般的な2つのパラメータ

def sort[T : Ordered](t: Seq[T]) 

同じことを意味する:

def sort[T](t: Seq[T])(implicit def Ordered[T]) 

私は2つの一般的なパラメータを持つクラスを持っている場合はどう。私。私はWriter[T, String]を確保できるようにしたいと思います。コンテキスト境界(T : ...)を使用できる構文があるか、暗黙的に明示的に書く必要がありますか?

答えて

10

はい、可能です。しかし、本当にとてもきれい:

trait Writer[T, O] { 
    def write(t: T): O 
} 

def writeToString[T: ({ type L[x] = Writer[x, String] })#L](t: T) = 
    implicitly[Writer[T, String]].write(t) 

implicit object intToStringWriter extends Writer[Int, String] { 
    def write(t: Int) = t.toString 
} 

そして:

scala> writeToString(1) 
res0: String = 1 

({ type L[x] = Writer[x, String] })#L事がtype lambdaと呼ばれています。時には彼らは非常に便利です(buggy)が、これは間違いなくその時代の一つではありません。明示的な暗黙の方がはるかに良いです。

+1

私は明示的に暗黙に固執します! – schmmd

関連する問題