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
クラスのより直接的な翻訳は、次のようになります。
ありがとう、2番目のスタイルは私が探していたものです。抽象型宣言の 'Value'の' Show'の制約を一行で表現したかったのです。とにかく、 'implicit def showValue:Show [Value]'を追加することもOKです。 – Labra