2017-01-05 9 views
2

は、私が経由Generic[F]を取得しようとしました:Generic [A]ここで、Aはクラスですか?型崩れを使用して

import shapeless._ 

class F(x: Int) 

が、それは失敗しました:

scala> Generic[F] 
<console>:20: error: could not find implicit value for parameter gen: shapeless.Generic[F] 
     Generic[F] 
      ^

Generic[F]を生産型崩れすることはできますか?もしそうなら、どうですか?

+1

私はdownvotesに驚いています。私は主にこの質問をして、Travis Brownが提供した洞察力のある答えを喚起するようにしました。 –

+0

合意 - それは私の見解では完全に合理的な質問です。 –

答えて

6

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の特定のケースを試すことに興味があります。

関連する問題