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

2024-05-11

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

例如,假设我有一个函数f: (A, B, C, ...) => Z。 (其实这样的还有很多fs,我事先不知道,所以我无法确定类型或数量A, B, C, ..., Z.)

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

  1. 我怎么打电话f一般用一个实例(A, B, C, ...)?如果签名为f事先知道,然后我可以做一些涉及Function.tupled f或同等学历。

  2. 如何定义另一个函数或方法(例如,某些object's apply方法)具有相同的签名f?也就是说,我如何定义一个g为此g(a, b, c, ...)类型检查当且仅当f(a, b, c, ...)类型检查?我正在研究Shapeless的HList为了这。据我目前所知,HList至少解决了“表示任意参数列表”的问题,而且 Shapeless 还可以解决元组之间的转换问题。然而,我仍然不确定我是否理解这将如何与通用数量的函数相适应(如果有的话)。

  3. 如何定义具有相关类型签名的另一个函数或方法f?现在想到的最大的例子是一些h: (A, B, C, ...) => SomeErrorThing[Z] \/ Z.

我记得前段时间看过一场关于 Shapeless 的会议演讲。虽然演示者没有明确演示这些内容,但他们确实演示了哪些内容(围绕抽象/泛化元组的各种技术与HLists)会让我相信使用相同的工具可以实现与上述类似的事情。

提前致谢!


是的,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)

请注意适当的静态返回类型。现在为how有用:

The FnToProduct类型类提供了某些类型的证据F is a FunctionN(对于一些N)可以将某些转换为函数HList到原始输出类型。这HList函数(一个Function1,准确地说)是Out实例的类型成员,或实例的第二个类型参数FnToProduct.Aux helper.

FnFromProduct反之亦然——这证明有些F is a Function1从一个HList某些输出类型可以转换为该输出类型的某种数量的函数。

In our wrap方法,我们使用FnToProduct.Aux来约束Out of the FnToProduct实例为F这样我们就可以参考HList参数列表和O结果类型为我们的类型FnFromProduct实例。那么实现就非常简单了——我们只需将实例应用到适当的位置即可。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 是否有一种类型安全的方法可以将较大的对象减少()为打字稿中的新类型?

    我有一个表示数据库查询结果的数据结构 它是一个具有许多属性的对象 所有属性都是标量 在我的例子中 都是字符串或数字 我想提取这些属性的一部分并填充一个具有已定义形状的新对象 const input Record
  • HDFS:使用 Java / Scala API 移动多个文件

    我需要使用 Java Scala 程序移动 HDFS 中对应于给定正则表达式的多个文件 例如 我必须移动所有名称为 xml从文件夹a到文件夹b 使用 shell 命令我可以使用以下命令 bin hdfs dfs mv a xml b 我可以
  • 数量重新分配逻辑 - 具有外部数据集的 MapGroups

    我正在研究一种复杂的逻辑 需要将数量从一个数据集重新分配到另一个数据集 在例子中我们有Owner and Invoice 我们需要从数量中减去Invoice准确地Owner匹配 在给定汽车的给定邮政编码处 减去的数量需要重新分配回同一辆车出
  • 你能在 scala 中使用 varargs 柯里化一个函数吗?

    我正在考虑如何用可变参数柯里化一种方法 然后我意识到我什至不知道如何去做 理想情况下 它应该让您可以随时开始使用它 然后以可迭代结束 def concat strs String strs mkString val curriedConca
  • ScalaTest v3:为什么需要实现convertToLegacyEqualizer

    Using 斯卡拉测试3 0 0 http www scalatest org install环境 Scala 2 11 8 sbt 0 13 5 IntelliJ 14 1 4 build sbt 只有 NOTE not using or
  • Scala 为了在 JVM 上运行做出了哪些妥协?

    Scala 是一种很棒的语言 但我想知道如果它有自己的运行时 如何改进 IE 由于 JVM 的选择 做出了哪些设计选择 我所知道的两个最重要的妥协是 类型擦除 http java sun com docs books tutorial ja
  • 在 Scala 中扩展函数1

    在几个例子中 我看到一个对象或一个类扩展Function1 E g object Cash extends CashProduct gt String in Scala 的隐藏功能 https stackoverflow com quest
  • 将 C# 数据类型参数传递给用 C++ 编写的 dll?

    仍在解决从这里开始的问题从 C 调用 C dll 函数 结构体 字符串和 wchar t 数组 https stackoverflow com questions 680066 calling c dll function from c o
  • Scala 程序中三元运算符的用法[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我有一个需要应用过滤器的对象数组 val filteredList list filter l gt pid true l Pro
  • scala 如何对元组进行排序?

    我试图了解 scala 如何处理元组的排序和排序 例如 如果我得到了列表 val l for i lt 1 to 5 yield i i 2 Vector 1 2 2 4 3 6 4 8 5 10 scala 知道如何对其进行排序 l so
  • sh / Bash shell 脚本中 !# (bang-pound) 的含义是什么?

    我想了解这个 Scala 脚本是如何工作的 usr bin env bash exec scala 0 object HelloWorld def main args Array String println Hello world arg
  • VB.NET 中的类型比较

    如何比较 VB NET 中的类型数据类型 我的代码 Private Function Equal ByVal parameter As String ByVal paramenterName As String ByVal dataType
  • 使用 Scala 宏或反射实例化类

    在我的 scala 代码中 我希望能够实例化一个新类 例如 假设我有以下代码 class Foo def foo 10 trait Bar val bar 20 理想情况下 我希望能够做类似的事情 def newInstance A lt
  • 如何删除spark输出中的compactbuffer

    下面是我在spark shell中运行的程序 但是当我将输出保存在HDFS中时 我得到带有compactbuffer的输出 如何删除spark输出中的compactbuffer Program val a sc textFile datag
  • “结构类型防护”与“if”配合使用,但不能用作数组过滤谓词

    我有一个联合类型 Pet在下面的示例中 组合了多个对象类型 每个对象类型都有一个type指示其类型的属性 有时我有一个联合类型的数组 Pet 并且需要 filter 它基于type财产 这本身工作得很好 但为了避免多余的类型声明 我想确保
  • 为什么要为字符变化类型指定长度

    参考 Postgres 文档字符类型 http www postgresql org docs current static datatype character html 我不清楚指定字符变化 varchar 类型的长度 假设 字符串的长
  • 避免函数内装箱/拆箱

    对于数字密集型代码 我编写了一个具有以下签名的函数 def update f Int Int Double gt Double Unit 然而 因为Function3不是专门的 每个应用程序f结果对 3 个参数和结果类型进行装箱 拆箱 我可
  • Erlang 中的非终止函数类型

    我正在学习 Erlang 并尝试使用 Dialyzer 在可能的情况下获得最大的类型安全性 有一点不太明白 什么是类型非终止的函数以及如何表示它 spec 有人能解释一下吗 永远循环且永不终止的函数具有返回类型no return 该返回类型
  • Scala UpperBound 和 LowerBound 概念

    下面是我尝试运行的代码 class Student def printDetails println I am a student def printSomeOtherDetails println I love Studying clas
  • collect_list() 是否保持行的相对顺序?

    想象一下我有以下 DataFrame df id featureName featureValue id1 a 3 id1 b 4 id2 a 2 id2 c 5 id3 d 9 想象一下我运行 df groupBy id agg coll

随机推荐