2016-08-15 1 views
1

나는 두 개의 레코드를 병합합니다. 내가 대신 a에 대한 None의 일반 문자열을 사용하는 경우에는 다음이 더 이상 사실이 아니다 : "pluf" :: Some("plif") :: HNilc.keysKey :: Key :: HNil입니다 :이 경우 c에서왜 형식이없는 레코드를 옵션과 병합 할 수없는 것입니까?</p> <pre><code>case object Key val a = (Key ->> Option.empty[String]) :: HNil val b = (Key ->> Option("plif")) :: HNil val c = a.merge(b) </code></pre> <p>을 그리고 우리는 우리가 <code>b == c</code> 있음을 예상하는대로 다음과 같이

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

는 것으로 밝혀졌습니다. 뭐라 구요?

차이가 나는 경우 Shapeless 2.1을 사용하고 있습니다.

답변

4

병합중인 유형이 병합과 일치해야한다고 가정합니다. 즉, 그들은 같은 유형이어야합니다. 첫 번째 경우에는 Option[String] 유형이 있고 두 번째 경우에는 Option[String]String 유형이 있습니다. 코드 (https://github.com/milessabin/shapeless/blob/master/core/src/main/scala/shapeless/ops/records.scala#L157-L192)와 암시 적 논리를 통해 작업을 보면

이해하는 방법 Merger 작품 :

  1. 우리는 가장 높은 우선 순위 (https://github.com/milessabin/shapeless/blob/master/core/src/main/scala/shapeless/ops/records.scala#L179-L191)와 implicit이 값 형식 레코드 사이에 일치하는 것을 선호 것을 알 수 있습니다 . 병합 된 레코드 출력의 값으로 대체됩니다.
  2. 우선 순위가 낮은 implicit 유형이 일치하지 않는 경우 (https://github.com/milessabin/shapeless/blob/master/core/src/main/scala/shapeless/ops/records.scala#L162-L167) 은 반복적으로 다음 머리와 를 추가 기록의 구조에 아래로 통과, 활성화됩니다.
  3. 마지막으로 HNil의 경우 두 번째 레코드의 다른 모든 작업이 끝나고 나머지는 처음에 추가됩니다. 즉, 크기가 맞지 않으면 사용할 수있는 것이 무엇이든 걸립니다.
관련 문제