什么是Case.Aux无形

Xia*_*ong 9 scala 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
Run Code Online (Sandbox Code Playgroud)
  1. 什么是Case.Aux?
  2. 为什么参数化类型是Int not String
  3. 如果size(((23,"foo",123),13)),如何定义CaseTuple?

提前谢谢了

Dau*_*nnC 10

关于PolyN函数的更多解释,你可以在这里找到:无形(scala)中的"at"是什么?

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))
}
Run Code Online (Sandbox Code Playgroud)

Casetype类为我们提供了一些poly函数给它的类型. http://xuwei-k.github.io/shapeless-sxr/shapeless-2.10-2.0.0-M1/shapeless/poly.scala.html#shapeless.PolyDefns;Case

让我们试着做一些功能:

def sizeF[F, S](t: (F, S)) = size(t)
Run Code Online (Sandbox Code Playgroud)

没有类型类定义如何应用函数是不可能的:

def sizeF[F, S](t: (F, S))
(implicit cse: Case[size.type, (F, S) :: HNil]) = size(t)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

正如所料.