2016-08-15 8 views
1

次のように私は2つのレコードをマージした場合:なぜシェイプレスなレコードをオプションとマージできないのでしょうか?

case object Key 
val a = (Key ->> Option.empty[String]) :: HNil 
val b = (Key ->> Option("plif")) :: HNil 
val c = a.merge(b) 

をその後、我々は、我々はb == cことを持って期待通り。しかし、私が代わりにaためNoneのプレーンな文字列を使用している場合、これはもはや真実ではありません。この場合c

case object Key 
val a = (Key ->> "pluf") :: HNil 
val b = (Key ->> Option("plif")) :: HNil 
val c = a.merge(b) 

があることが判明:"pluf" :: Some("plif") :: HNilc.keysKey :: Key :: HNilです。何がありますか?

これは何らかの違いがある場合、私はShapeless 2.1を使用しています。

答えて

4

マージされるタイプは、マージするのに合っている必要があります。つまり、同じタイプのものでなければなりません。最初のケースでは2つのOption[String]タイプがあり、2番目のケースではOption[String]Stringがあります。

コード(https://github.com/milessabin/shapeless/blob/master/core/src/main/scala/shapeless/ops/records.scala#L157-L192)を見ると、どのようにMerger作品を理解するために、暗黙的なロジックを通して作業:我々は最高の優先度(https://github.com/milessabin/shapeless/blob/master/core/src/main/scala/shapeless/ops/records.scala#L179-L191)とimplicitは、値の型がレコードの間で一致していることを好むことがわかります

  1. 。これは、マージされたレコード出力の値を置き換えます。
  2. 優先順位の低いimplicit 型が一致しない場合(https://github.com/milessabin/shapeless/blob/master/core/src/main/scala/shapeless/ops/records.scala#L162-L167) だけ繰り返し、その後頭と を追加、レコードの構造にダウントラバース活性化されます。
  3. 最後に、HNilの場合、2番目のレコード内の他のすべての操作の後に残っているものが最初のものに追加されます。つまり、サイズが一致しない場合は、それ以外のものがあればそれが必要です。
関連する問題