代码之家  ›  专栏  ›  技术社区  ›  Todd O'Bryan

如何为类型的并集定义类型类?

  •  0
  • Todd O'Bryan  · 技术社区  · 1 年前

    我遇到的问题是,当我试图在并集上定义类型类时,会得到无限递归。

    trait Foo[A]:
      extension (a: A)
        def bar: String
    

    现在假设我定义了以下给定:

    given Foo[Int] with ...
    
    given Foo[String] with ...
    

    现在我想创建一个工会

    type Value = String | Int
    

    当然, Value 应该是类型类的成员。但如果我这样做:

    given Foo[Value] with
       extension (v: Value)
         def bar: String = v match
           case i: Int => i.bar
           case s: String => s.bar
    

    问题是 i.bar s.bar 呼叫 bar 这与 价值 ,不与 Int String ,最后我得到了无限递归。选角也无济于事。

    因为 酒吧 是一个扩展函数,我不知道如何获得 Foo[Int] Foo[String] 这样我就可以直接打电话了。有没有办法摆脱这种局面,或者我把自己逼到了一个角落?

    1 回复  |  直到 1 年前
        1
  •  2
  •   esse    1 年前

    这个怎么样:

    scala> given Foo[Value] with
         |    extension (v: Value)
         |      def bar: String = v match
         |        case i: Int => summon[Foo[Int]].bar(i)
         |        case s: String => summon[Foo[String]].bar(s)
         |
    // defined object given_Foo_Value