2017-04-27 13 views
1

型崩れを使用してのADTの列挙に関する@TravisBrownによって上空啓発questionに続いて、私は次のコードスニペットが残っています:私は持っていないように私はメソッド内でこれをカプセル化したい暗黙の引数:関数シグネチャをエンコードする方法は?

implicitly[EnumerableAdt[Foo]].values 

各呼び出しの後に.valuesに(これは私にとってはよりクリーンなAPIのようです)。 しかし、私はそれを正しくするように見えることはできません。 implicitly[EnumerableAdt[Foo]]をカプセル化しようとすると、暗黙の解決エラーが発生します。

私にはほとんど意味を成していた私は何をしようとしたが、例えば、だった:私にしてもあまり意味をなさずにev確か

def imply[T](implicit ev: T):Set[T] = implicitly[EnumerableAdt[T]].values

私はタイプレベルプログラミングの専門家ではありません。

答えて

1

implicitly[X]の定義を見ると、スコープ内にタイプXの暗黙の引数が必要であることがわかります。あなたの例では、暗黙的にev: Tが範囲内にありますが、それはimplicitly[EnumerableAdt[T]]を呼び出すには不十分です!代わりに次の定義を試してください:

def imply[T](implicit ev: EnumerableAdt[T]):Set[T] = ev.values 
+0

素晴らしいことですが、それは機能します! – Yaneeve

関連する問題