2016-08-12 10 views
1

抽象型ValueをタイプクラスShowからcatsに属すように制約する必要があります。Scalaで型クラスの抽象型を使用する

私の最初の試みは、のようになります。

package examples 
import cats._ 
import cats.data._ 
import cats.implicits._ 

class UsingShow1 { 
    type Value <: Show[Value] // Not sure if this declaration is right 

    def showValues(vs: List[Value]): String = 
    vs.map(implicitly[Show[Value]].show(_)).mkString // Error line 

} 

しかし、コンパイラが暗黙のパラメータShow[Value]を見つけることができません。

class UsingShow2[Value: Show] { 
    def showValues(vs: List[Value]): String = 
    vs.map(implicitly[Show[Value]].show(_)).mkString 
} 

しかし、私は抽象型の代わりの型パラメータを使用することが可能であるかどうかを知りたいと思った:

は、私は前述の例を定義することができることを知っています。 、

class UsingShow1 { 
    type Value 
    implicit def showValue: Show[Value] 

    def showValues(values: List[Value]): String = 
    values.map(showValue.show).mkString 
} 

基本的には:

class UsingShow1 { 
    type Value 
    def showValues(values: List[Value])(implicit showValue: Show[Value]): String = 
    values.map(showValue.show).mkString 
} 

をしかし、あなたのUsingShow2クラスのより直接的な翻訳は、次のようになります。

答えて

5

は、単にいつものように、使用現場で、タイプShow[Value]の暗黙のパラメータを追加しますタイプValue抽象タイプのメンバーに交換したので、暗黙のパラメータ暗黙の抽象メンバ(私の例ではshowValue)です。

+0

ありがとう、2番目のスタイルは私が探していたものです。抽象型宣言の 'Value'の' Show'の制約を一行で表現したかったのです。とにかく、 'implicit def showValue:Show [Value]'を追加することもOKです。 – Labra

関連する問題