如何使用“隐式”作为 apply() 参数?

2023-12-21

我想做这个:

abstract class Context {
    def getInt(id: Int): Int
}

abstract class Dependency[+T]
(val name: String, val id: Int)
extends Function1[Context,T]

class IntDependency(name: String, id: Int)
extends Dependency[Int](name, id) {
    def apply(implicit context: Context): Int =
        context.getInt(id)
}

但随后我收到如下错误消息:

class IntDependency needs to be abstract, since method apply in trait
Function1 of type (v1: Context)Long is not defined (Note that T1 does
not match Context)

我理解隐式通常应该是second参数列表,但我不知道如何对其进行编码,以便它进行编译,并给出我想要的结果。

说明:我正在尝试创建一个可以定义“函数”对象的框架,该对象可以依赖其他函数来计算其值。所有函数都应该只采用一个 Context 参数。上下文知道其他函数的“结果”。函数实例应该是不可变的,状态驻留在上下文中。我希望函数在创建时创建“依赖”字段,该字段采用上下文隐含地,并返回该上下文中的依赖项的值,以便访问 apply 方法内部的依赖项“感觉就像”访问参数或字段,即无需显式地将上下文作为参数提供给依赖项。


您确定需要您的Dependency延长一个Function?因为如果你不这样做,就离开extends Function1[Context,T]退出,你的代码就可以工作了。

如果您确实需要延长Function我不知道你的情况有什么解决方案。但在某些情况下,您可以尝试超载apply方法。像这儿:

scala> val sum = new Function1[Int, Function1[Int, Int]] {
         |      def apply(a: Int) = (b: Int) => a + b
         |      def apply(a: Int)(implicit b: Int) = a + b
         |}
sum: java.lang.Object with (Int) => (Int) => Int{def apply(a:Int)(implicit b: Int): Int} = <function1>

scala> sum(2)(3)
res0: Int = 5

scala> implicit val b = 10
b: Int = 10

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

如何使用“隐式”作为 apply() 参数? 的相关文章

  • 具有上限的联合类型

    我正在遵循这个问题的公认答案中提出的技术如何定义 类型析取 联合类型 https stackoverflow com questions 3508077 does scala have type disjunction union type
  • 在 Spark MLlib 上使用 Java 中的 Breeze

    在尝试从Java使用MLlib时 使用微风矩阵运算的正确方法是什么 例如scala 中的乘法很简单 matrix vector 相应的功能在Java中是如何表达的 有一些方法 例如 colon times 可以通过正确的方式调用 breez
  • andThen 类型不匹配的 Scala 链接函数

    我有一堆函数可以清理文本并将它们分成单词 最小的例子 val txt Mary had a little nlamb val stopwords Seq a def clean text String String text replace
  • 在 Scala 中将元素追加到列表末尾

    我无法添加 type 元素T到一个列表中List T 我尝试过myList myElement但它似乎创建了一个奇怪的对象并访问myList last始终返回放入列表中的第一个元素 我怎么解决这个问题 List 1 2 3 4 Result
  • scala中的反引号有什么用[重复]

    这个问题在这里已经有答案了 我在一本书上找到了以下代码 val list List 5 4 3 2 1 val result 0 list running total next element running total next elem
  • IntelliJ:线程“主”java.lang.NoClassDefFoundError中的异常:org/apache/spark/sql/types/DataType

    附言 有一个类似的问题here https stackoverflow com questions 40287289 java lang noclassdeffounderror org apache spark logging 但那是在
  • 如何在 scala repl 和 sbt 控制台中关闭/打开 typer 阶段

    是否可以在不退出当前会话的情况下切换阶段 我尝试进入 power 模式 但它仍然不打印类型 在SBT中只需添加以下设置 set scalacOptions in Compile console Xprint typer 在 REPL 中你可
  • 获取SettingKey[T]的值

    我正在开发一个用于文档生成的插件 我想将所有生成的文件输出到我选择的目录中 该目录可以是SBT的子目录target目录 如下 val newTargetDirectory SettingKey File document target di
  • 将 Tuple2 的值部分(即映射)合并为按 Tuple2 的键分组的单个映射

    我在 Scala 和 Spark 中这样做 我有和Dataset of Tuple2 as Dataset String Map String String 下面是值的示例Dataset A 1 gt 100 2 gt 200 3 gt 1
  • Scala 使用的 Redis 客户端库建议

    我正在计划使用 Scala 中的 Redis 实例进行一些工作 并正在寻找有关使用哪些客户端库的建议 理想情况下 如果存在一个好的库 我希望有一个为 Scala 而不是 Java 设计的库 但如果现在这是更好的方法 那么仅使用 Java 客
  • 如何将 Java 地图转换为在 Scala 中使用?

    我正在开发一个 Scala 程序 该程序调用 Java 库中的函数 处理结果并生成 CSV 有问题的 Java 函数如下所示 Map
  • Scala 案例类忽略 Spark shell 中的导入

    我希望这个问题有一个明显的答案 我刚刚升级到 Spark v2 0 并且遇到了一个奇怪的问题火花外壳 Scala 2 11 版本 如果我输入以下最小的 Scala import java sql Timestamp case class C
  • Java 拥有闭包后 Scala 的优势 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 随着 Java 中添加了闭包 作为语言选择 Scala 相对于 Java 的优势是什么 有人可以详细说明一下有什么优点吗 除了闭包 J
  • 如何在 Scala 2.11 中查找封闭源文件的名称

    在编译时 如何在 scala 2 11 中检索当前源文件 编写代码的位置 的名称 这是一种实际有效的方法 val srcFile new Exception getStackTrace head getFileName println sr
  • Scala 和 Python 的通行证

    我想知道 是否有相当于 python 的 pass 表达式 这个想法是编写没有实现的方法签名 并编译它们只是为了对某些库原型的这些签名进行类型检查 我能够使用以下方法模拟这种行为 def pass A A throw new Excepti
  • Spark:查找前 n 个值的高性能方法

    我有一个很大的数据集 我想找到具有 n 个最高值的行 id count id1 10 id2 15 id3 5 我能想到的唯一方法是使用row number没有分区就像 val window Window orderBy desc coun
  • 在没有匹配器的情况下如何跳过specs2中的测试?

    我正在尝试使用 scala 中的 specs2 测试一些与数据库相关的内容 目标是测试 db running 然后执行测试 我发现如果数据库关闭 我可以使用 Matcher 类中的 orSkip 问题是 我正在获取一个匹配条件的输出 作为
  • sbt 找不到启动器 jar:./bin/sbt-launch.jar

    我已经成功地使用 sbt 进行基本的 Scala 编译好几年了 但有一天它由于某种原因停止工作 我在自己的帐户中使用它 但我决定让我的系统管理员在我们的本地网络上安装最新版本 当我尝试运行它时 我得到 找不到启动器 jar bin sbt
  • 将下划线分配给变量。下划线是做什么的?

    最近我遇到了这样的代码 var myVariable variableKind 这似乎是一种分配方式null to myVariable 谁能解释一下背后的理由 在这种情况下 分配之间有什么区别 and null到一个变量 它使用默认值初始
  • 你能在 scala 中使用 varargs 柯里化一个函数吗?

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

随机推荐