gpt4 book ai didi

scala - Case.Aux在无形中是什么

转载 作者:行者123 更新时间:2023-12-04 03:51:33 26 4
gpt4 key购买 nike

我对无形功能概述中显示的示例感到困惑。

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
  • 什么是Case.Aux?
  • 为什么参数化类型是Int而不是String
  • if size(((((23,“foo”,123),13))),如何定义CaseTuple?

  • 提前谢谢了

    最佳答案

    您可以在这里找到有关PolyN函数的更多说明:What is "at" in shapeless (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类型类为我们提供了将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)

    没有类型类,它就不可能定义如何应用函数,这是不可能的:
    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

    如预期的那样。

    关于scala - Case.Aux在无形中是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24140746/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com