簡體   English   中英

什么是Case.Aux無形

[英]what is Case.Aux in 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
  1. 什么是Case.Aux?
  2. 為什么參數化類型是Int not String
  3. 如果size(((23,“foo”,123),13)),如何定義CaseTuple?

提前謝謝了

關於PolyN功能的更多解釋,你可以在這里找到: 什么是無形的(scala)?

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類型類提供了我們將一些多邊形函數應用於某個對象的類型。 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)

沒有類型類定義如何應用函數是不可能的:

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

正如所料。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM