【问题标题】:Add marker traits with Shapeless使用 Shapeless 添加标记特征
【发布时间】:2018-03-23 06:27:23
【问题描述】:

我的问题是我想将特征混合到一些现有的对象实例中

而不是做

sealed trait Type
trait A extends Type
trait B extends Type

case class Basic(int, bool)

val someInt = 2
val someBool = False
val someType = "a"

someType match {
 case "a" => new Basic(someInt, someBool) with A
 case "b" => new Basic(someInt, someBool) with B
}

我只想执行一次 new Basic() 然后以某种方式添加A和B

有没有可能用 Shapeless 以某种方式做到这一点? 我希望能够使用 Generic 来获取 HList,在其中添加标记特征信息,并将其转换回带有附加特征的 Basic。但我实际上并没有看到 HList 是如何实现的。

【问题讨论】:

    标签: scala traits shapeless


    【解决方案1】:

    例如,您可以定义一个Poly

    import shapeless.Poly1
    
    object myPoly extends Poly1 {
      implicit val aCase: Case.Aux[A, Basic with A] = at(_ => new Basic() with A)
      implicit val bCase: Case.Aux[B, Basic with B] = at(_ => new Basic() with B)
    }
    
    myPoly(new A {}) 
    myPoly(new B {}) 
    

    我猜HList 在这里无关紧要,因为GenericType 转换为副产品而不是HList

    import shapeless.{:+:, CNil, Generic}
    
    sealed trait Type
    case class A() extends Type
    case class B() extends Type
    
    implicitly[Generic.Aux[Type, A :+: B :+: CNil]]
    

    您可以使用Polysingleton types

    import shapeless.{Poly1, Witness}
    import shapeless.syntax.singleton._
    
    sealed trait Type
    trait A extends Type
    trait B extends Type
    
    case class Basic(int: Int, bool: Boolean)
    
    val someInt: Int = 2
    val someBool: Boolean = false
    val someType: String = "a"
    
    object myPoly extends Poly1 {
      implicit val aCase: Case.Aux[Witness.`"a"`.T, Basic with A] = at(_ => new Basic(someInt, someBool) with A)
      implicit val bCase: Case.Aux[Witness.`"b"`.T, Basic with B] = at(_ => new Basic(someInt, someBool) with B)
    }
    
    myPoly("a".narrow)
    myPoly("b".narrow)
    //  myPoly("c".narrow) // doesn't compile
    

    【讨论】:

    • 我不明白我如何使用 poly。如果我有一个 Basic 实例,如何向它添加 A trait?给定:myPoly(new A {}) .
    • 你能写出整个代码吗?现在我不得不猜测BasicsomeType 是如何定义的。
    猜你喜欢
    • 2019-12-16
    • 2018-12-31
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    相关资源
    最近更新 更多