F
の表記は何ですか? HNil
であると言うこともできますが、x
はクラス本体の外側には表示されないため、Shapelessはインスタンスをまったく提供しないという決定を下します。これは私の見解では正しい設計意思決定ですが、あなたのクラスにHNil
インスタンスを提供するShapelessを想像するのは簡単です。
Generic
はちょうど別の型クラスであるので、それも可能ですF
、用の独自のインスタンスを定義することが合理的に簡単だろう:別の答えのメモとして
import shapeless._
class F(x: Int)
object F {
implicit val genericF: Generic.Aux[F, HNil] = new Generic[F] {
type Repr = HNil
def from(r: HNil): F = new F(0)
def to(t: F): HNil = HNil
}
}
、あなたは型崩れのためのインスタンスを提供するために取得することができますあなたはクラスをケースクラスに変更します。それは、しかし、あなたはまた、val
にコンストラクタのパラメータを変えることができるか、それを削除する唯一の方法はありません。それがあった場合を除き
scala> class F(val x: Int)
defined class F
scala> shapeless.Generic[F]
res0: shapeless.Generic[F]{type Repr = shapeless.::[Int,shapeless.HNil]} = [email protected]
scala> class F()
defined class F
scala> shapeless.Generic[F]
res1: shapeless.Generic[F]{type Repr = shapeless.HNil} = [email protected]
あなたは(ただし、パラメータvar
をしたり、クラスの抽象を作ることができませんでした封印され、ケースクラスまたはオブジェクトの実装がありました)。あるいは、あなたは自分自身のインスタンスを再び定義しなければならないでしょう。Generic
のドキュメントで契約を破ることになります。特徴付けされたタイプは、「標準的な方法を持つ不変のデータタイプ」インスタンスの構築と解体」を参照してください。
Generic
インスタンスはどのようなクラス定義のアレンジメントの正確な詳細がどこにも記載されていないことがわかっている限り(the sourceは読みにくいですが)、あなたの限界をテストするのはかなり簡単ですREPLの特定のケースを試すことに興味があります。
私はdownvotesに驚いています。私は主にこの質問をして、Travis Brownが提供した洞察力のある答えを喚起するようにしました。 –
合意 - それは私の見解では完全に合理的な質問です。 –