gpt4 book ai didi

Scala Function.tupled 和 Function.untupled 等效于变量 arity,或者,使用元组调用变量 arity 函数

转载 作者:行者123 更新时间:2023-12-03 22:32:49 25 4
gpt4 key购买 nike

昨晚我试图做一些关于接受和调用通用函数的事情(即类型在调用站点是已知的,但可能因调用站点而异,因此定义应该是跨arities的通用函数)。

例如,假设我有一个函数 f: (A, B, C, ...) => Z . (实际上有很多这样的 f s,我事先不知道,所以我无法修复 A, B, C, ..., Z 的类型和计数。)

我正在努力实现以下目标。

  • 如何调用 f通常带有 (A, B, C, ...) 的实例?如果f的签名事先知道,然后我可以做一些涉及 Function.tupled f 的事情或等效的。
  • 如何定义与 object 具有相同签名的另一个函数或方法(例如,某些 applyf 方法) ?也就是说,我如何定义一个g g(a, b, c, ...)类型检查当且仅当 f(a, b, c, ...)类型检查?我正在研究 Shapeless 的 HList为了这。据我目前所知,HList至少解决了“表示任意 arity args 列表”问题,此外,Shapeless 将解决与元组之间的转换问题。但是,我仍然不确定我是否理解这将如何与通用数量的函数相匹配,如果有的话。
  • 如何定义具有相关类型签名的另一个函数或方法到 f ?现在想到的最大的例子是一些h: (A, B, C, ...) => SomeErrorThing[Z] \/ Z .

  • 我记得前段时间看过一个关于 Shapeless 的 session 演示。虽然演示者没有明确展示这些东西,但他们所展示的内容(围绕抽象/泛化元组的各种技术 vs HList s)让我相信使用相同的工具可以实现与上述类似的事情。

    提前致谢!

    最佳答案

    是的,Shapeless 绝对可以在这里为您提供帮助。例如,假设我们想要获取任意数量的函数并将其转换为具有相同数量但返回类型包含在 Option 中的函数。 (我认为这将触及您问题的所有三点)。

    为了简单起见,我只会说 Option总是 Some .这需要非常密集的四行:

    import shapeless._, ops.function._

    def wrap[F, I <: HList, O](f: F)(implicit
    ftp: FnToProduct.Aux[F, I => O],
    ffp: FnFromProduct[I => Option[O]]
    ): ffp.Out = ffp(i => Some(ftp(f)(i)))

    我们可以证明它有效:
    scala> wrap((i: Int) => i + 1)
    res0: Int => Option[Int] = <function1>

    scala> wrap((i: Int, s: String, t: String) => (s * i) + t)
    res1: (Int, String, String) => Option[String] = <function3>

    scala> res1(3, "foo", "bar")
    res2: Option[String] = Some(foofoofoobar)

    请注意适当的静态返回类型。现在了解它的工作原理:
    FnToProduct类型类提供了某些类型 F 的证据是 FunctionN (对于一些 N )可以从一些 HList 转换为函数到原始输出类型。 HList函数(准确地说是 Function1)是 Out实例的类型成员,或 FnToProduct.Aux 的第二个类型参数 helper 。
    FnFromProduct反其道而行之——有证据表明某些 FFunction1来自 HList到某种输出类型,该输出类型可以转换为该输出类型的某种元数的函数。

    在我们的 wrap方法,我们使用 FnToProduct.Aux约束 OutFnToProduct F 的实例这样我们可以引用 HList参数列表和 O我们的 FnFromProduct 类型中的结果类型实例。然后实现非常简单——我们只需在适当的地方应用实例。

    这可能看起来很复杂,但是一旦您在 Scala 中使用这种通用编程一段时间,它就会或多或少变得直观,我们当然很乐意回答有关您的用例的更具体的问题。

    关于Scala Function.tupled 和 Function.untupled 等效于变量 arity,或者,使用元组调用变量 arity 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31481836/

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