Scala 什么是Case.Aux in shapeless

Scala 什么是Case.Aux in shapeless,scala,shapeless,Scala,Shapeless,我对shapeless特性概述中显示的示例感到困惑 object size extends Poly1 { implicit def caseInt = at[Int](x => 1) implicit def caseString = at[String](_.length) implicit def caseTuple[T, U] (implicit st : Case.Aux[T, Int], su : Case.Aux[U, Int]) = at[(

我对shapeless特性概述中显示的示例感到困惑

object size extends Poly1 {
  implicit def caseInt = at[Int](x => 1)
  implicit def caseString = at[String](_.length)
  implicit def caseTuple[T, U]
    (implicit st : Case.Aux[T, Int], su : Case.Aux[U, Int]) =
      at[(T, U)](t => size(t._1)+size(t._2))
}

scala> size(((23, "foo"), 13))
res7: Int = 5
  • 怎么回事,奥克斯
  • 为什么参数化类型是Int而不是String
  • 如果大小(((23,“foo”,123),13)),如何定义CaseTuple

  • 提前非常感谢

    有关
    PolyN
    函数的更多说明,您可以在此处找到:

    1和2。因此,让我们重写这段代码,使其更加清晰:

    object size extends Poly1 {
      implicit def caseInt = at[Int](x => 1)
      implicit def caseString = at[String](_.length)
      implicit def caseTuple[T, U]
        (implicit st : Case.Aux[T, Int], su : Case.Aux[U, Int]) =
          at[(T, U)](t => st(t._1) + su(t._2))
    }
    
    Case
    type类为我们提供了将一些多边形函数应用于具有其类型的对象的功能。

    让我们试着做一些功能:

    def sizeF[F, S](t: (F, S)) = size(t)
    
    def sizeF[F, S](t: (F, S))
    (implicit cse: Case[size.type, (F, S) :: HNil]) = size(t)
    
    如果没有定义如何应用函数的类型类,这是不可能的:

    def sizeF[F, S](t: (F, S)) = size(t)
    
    def sizeF[F, S](t: (F, S))
    (implicit cse: Case[size.type, (F, S) :: HNil]) = size(t)
    
    Case.Aux[T,U]
    这是一个快捷方式:
    poly.Case[this.type,T::HNil]{type Result=U}
    T
    -它是一个参数,
    U
    -应用程序后的结果类型

    3.让我们修改函数,并将其应用到
    ((23,“foo”,123),13)
    ,我们需要添加函数来处理三元组:

    object size extends Poly1 {
      implicit def caseInt = at[Int](x => 1)
      implicit def caseString = at[String](_.length)
      implicit def caseTuple[T, U]
      (implicit st : Case.Aux[T, Int], su : Case.Aux[U, Int]) =
        at[(T, U)](t => size(t._1) + size(t._2))
      implicit def caseTriple[T, U, F]
      (implicit st : Case.Aux[T, Int], su : Case.Aux[U, Int], sf: Case.Aux[F, Int]) =
        at[(T, U, F)](t => size(t._1) + size(t._2) + size(t._3))
    }
    
    size(((23, "foo", 123), 13)) //> res0: Int = 6
    

    正如预期的那样。

    谢谢你的回答,我能理解Case.Aux吗?这样,因为元组可以有多种类型,它需要委托Case.Aux来获取每种类型,然后递归地获取值。我想知道这个案例还有没有其他好的用法。Aux(也许不是隐式的)@Cloudtech正如你所看到的,它只对应用有用;在我的函数
    sizeF
    示例中,可以使用
    Case.Aux
    隐式cse:size.Case.Aux[(F,S),R]
    (您需要添加
    R
    作为类型参数)。在
    shapeless
    中,每个类型类都有一个
    Aux
    ,mb代表美丽(重新定义
    Result
    type是一件难看的事情):)当您使用多个类型类并且需要链式应用它们时,定义结果类型非常有用(我的意思是像smth
    tc1(tc2(tc3(object))