Scala 为什么可以';我似乎不能正确地将不成形的记录与选项合并?

Scala 为什么可以';我似乎不能正确地将不成形的记录与选项合并?,scala,shapeless,Scala,Shapeless,如果我按如下方式合并两条记录: 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,那么这就不再是真的了: case object Key val a = (Key ->> "p

如果我按如下方式合并两条记录:

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
,那么这就不再是真的了:

case object Key
val a = (Key ->> "pluf") :: HNil
val b = (Key ->> Option("plif")) :: HNil
val c = a.merge(b)
在这种情况下,
c
原来是:
“pluf”::一些(“plif”)::HNil
c.keys
Key::Key::HNil
。有什么好处


如果这有什么不同的话,我使用的是Shapeless 2.1。

我假设被合并的类型必须与合并一致。也就是说,它们必须是同一类型的。在第一种情况下,您有两个
选项[String]
类型,而在第二种情况下,您有一个
选项[String]
和一个
字符串

查看代码()并通过隐式逻辑了解
合并
的工作原理:

  • 我们可以看到,具有最高优先级()的
    隐式
    ,更喜欢记录之间的值类型匹配。它替换合并记录输出中的值
    
  • 低优先级
    隐式
    
    ()
    仅在类型不匹配时激活,并附加头和
    然后迭代地向下遍历到记录的结构中
  • 最后,在
    HNil
    的情况下,它只是将第二条记录中所有其他操作之后剩余的内容附加到第一条记录。也就是说,如果它们的大小不匹配,则需要其他可用的东西

  • 我假设被合并的类型必须与合并一致。也就是说,它们必须是同一类型的。在第一种情况下,您有两个
    选项[String]
    类型,而在第二种情况下,您有一个
    选项[String]
    和一个
    字符串

    查看代码()并通过隐式逻辑了解
    合并
    的工作原理:

  • 我们可以看到,具有最高优先级()的
    隐式
    ,更喜欢记录之间的值类型匹配。它替换合并记录输出中的值
    
  • 低优先级
    隐式
    
    ()
    仅在类型不匹配时激活,并附加头和
    然后迭代地向下遍历到记录的结构中
  • 最后,在
    HNil
    的情况下,它只是将第二条记录中所有其他操作之后剩余的内容附加到第一条记录。也就是说,如果它们的大小不匹配,则需要其他可用的东西