implicit parameters の使い方

implicit conversions に続いて、implicit parameters も使ってみました。

以下、implicit parameters を使用している関数の例。

abstract class Foo
def foo(msg: String)(implicit p: Foo) = println(msg + p)

implicit parameters の引数リストは一番最後に定義する必要があります。つまり、foo(implicit p: Foo)(msg: String) ではダメってことです。
あと、複数の引数を implicit parameters として定義できます。foo(msg: String)(implicit p1: Foo, p2: Hoge, ...) とかはありってことです。

実際に関数を呼び出す時は、implicit parameters の候補とする値に対して、implicit を付加しておきます。

implicit val bar = new Foo { override def toString = "Bar" }
foo("Hello")

object も候補にできます。

implicit object Bar extends Foo { override def toString = "Bar" }
foo("Hello")

ScalaByExample.pdf の例では、Generics とうまく組み合わせて適切なオブジェクトが implicit parameters に渡されるようにしています。これならば、型に依存する部分とそうでない部分を分離した上で、型に依存する部分の部品の選択をコンパイラにやらせることが出来そうですね。