Scala 什么是Case.Aux in shapeless
我对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[(
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
提前非常感谢有关
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是一件难看的事情):)当您使用多个类型类并且需要链式应用它们时,定义结果类型非常有用(我的意思是像smthtc1(tc2(tc3(object))