解释 Scala 类型级编程中使用的“LowPriorityImplicits”模式

2023-11-27

当查看一些 Scala 库的源代码时,例如无形的,我经常发现名为LowPriorityImplicits.

您能解释一下这个模式吗?解决的问题是什么,该模式是如何解决的?


该模式允许您拥有隐式层次结构,避免编译器产生与歧义相关的错误,并提供一种对它们进行优先级排序的方法。作为示例,请考虑以下内容:

trait MyTypeclass[T] { def foo: String }
object MyTypeclass {
  implicit def anyCanBeMyTC[T]: MyTypeclass[T] = new MyTypeclass[T] { 
    val foo = "any" 
  }

  implicit def specialForString[T](implicit ev: T <:< String): MyTypeclass[T] = new MyTypeclass[T] {
    val foo = "string"
  }
}

println(implicitly[MyTypeclass[Int]].foo) // Prints "any"
println(implicitly[MyTypeclass[Boolean]].foo) // Prints "any"
println(implicitly[MyTypeclass[String]].foo) // Compilation error

最后一行中出现的错误是:

<console>:25: error: ambiguous implicit values:
  both method anyCanBeMyTC in object MyTypeclass of type [T]=> MyTypeclass[T]
  and method specialForString in object MyTypeclass of type [T](implicit ev: <: <[T,String])MyTypeclass[T]
  match expected type MyTypeclass[String]
       println(implicitly[MyTypeclass[String]].foo)

这不会编译,因为隐式解析会发现歧义;在这种情况下,我们定义的有点人为String当我们可以将其定义为时,使用隐式证据来引发歧义的情况implicit def specialForString: MyTypeclass[String] = ...并且没有任何歧义。但在某些情况下,您在定义隐式实例时需要依赖其他隐式参数,并使用低优先级模式,您可以按如下方式编写并使其正常工作:

trait MyTypeclass[T] { def foo: String }

trait LowPriorityInstances {
  implicit def anyCanBeMyTC[T]: MyTypeclass[T] = new MyTypeclass[T] { 
    val foo = "any" 
  }
}

object MyTypeclass extends LowPriorityInstances {
  implicit def specialForString[T](implicit ev: T <:< String): MyTypeclass[T] = new MyTypeclass[T] {
    val foo = "string"
  }
}

println(implicitly[MyTypeclass[Int]].foo) // Prints "any"
println(implicitly[MyTypeclass[Boolean]].foo) // Prints "any"
println(implicitly[MyTypeclass[String]].foo) // Prints "string"

还值得注意的是,这种模式不限于两层,但您可以创建一个特征层次结构,并在其中包含隐式定义,这些定义沿着继承树从更具体到更通用。

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

解释 Scala 类型级编程中使用的“LowPriorityImplicits”模式 的相关文章

  • 高效序列化案例类

    对于我正在工作的图书馆 我需要提供一个高效 便捷 typesafe序列化 scala 类的方法 理想的情况是用户可以创建一个案例类 并且只要所有成员都是可序列化的 它似乎也应该如此 我准确地知道序列化和反序列化阶段的类型 因此不需要 也不能
  • 可选择将项目添加到 Scala 映射

    我正在寻找这个问题的惯用解决方案 我正在构建一个valScala 不可变 Map 并希望有选择地添加一项或多项 val aMap Map key1 gt value1 key2 gt value2 if condition key3 gt
  • 在 Spark MLlib 上使用 Java 中的 Breeze

    在尝试从Java使用MLlib时 使用微风矩阵运算的正确方法是什么 例如scala 中的乘法很简单 matrix vector 相应的功能在Java中是如何表达的 有一些方法 例如 colon times 可以通过正确的方式调用 breez
  • 使用 Scala 获取 Spark 数据集中最新时间戳对应的行

    我对 Spark 和 Scala 比较陌生 我有一个具有以下格式的数据框 Col1 Col2 Col3 Col 4 Col 5 Col TS Col 7 1234 AAAA 1111 afsdf ewqre 1970 01 01 00 00
  • 如何在映射中将字符串转换为 Seq[String]

    我有一个Map String String 以及需要的第三方功能Map String Seq String 有没有一种简单的方法来转换它 以便我可以将地图传递给函数 original mapValues Seq 注意mapValues返回地
  • Java 8 Stream,获取头部和尾部

    Java 8 引入了Stream http download java net jdk8 docs api java util stream Stream html类似于 Scala 的类Stream http www scala lang
  • IntelliJ:线程“主”java.lang.NoClassDefFoundError中的异常:org/apache/spark/sql/types/DataType

    附言 有一个类似的问题here https stackoverflow com questions 40287289 java lang noclassdeffounderror org apache spark logging 但那是在
  • Scala Spark 包含与不包含

    我可以使用 contains 过滤 RDD 中的元组 如下所示 但是使用 不包含 来过滤 RDD 又如何呢 val rdd2 rdd1 filter x gt x 1 contains 我找不到这个的语法 假设这是可能的并且我没有使用Dat
  • 为什么自类型类可以声明类

    我知道 Scala 只能混合特征 这对于依赖注入和蛋糕模式是有意义的 我的问题是为什么我仍然可以声明一个需要另一个 类 但不需要特征的类 Code class C class D self C gt 这仍然编译成功 我认为它应该编译失败 因
  • 在 Spark 结构化流 2.3.0 中连接两个流时,左外连接不发出空值

    两个流上的左外连接不发出空输出 它只是等待记录添加到另一个流中 使用套接字流来测试这一点 在我们的例子中 我们想要发出具有 null 值的记录 这些记录与 id 不匹配或 且不属于时间范围条件 水印和间隔的详细信息如下 val ds1Map
  • Spark 2.2 无法将 df 写入 parquet

    我正在构建一个聚类算法 我需要存储模型以供将来加载 我有一个具有以下架构的数据框 val schema new StructType add StructField uniqueId LongType add StructField tim
  • 为什么这些类型参数不符合类型细化?

    为什么此 Scala 代码无法进行类型检查 trait T type A trait GenFoo A0 S lt T type A A0 trait Foo S lt T extends GenFoo S A S 我不明白为什么 类型参数
  • 使用 Shapeless 记录组合任意数量的状态更改函数

    我正在尝试移植combineReducers从 Redux 到 Scala 这个想法是每个函数控制它的一小部分状态并且combineReducers创建一个控制整个状态的函数 我无法找出应该像这样工作的函数所需的签名 sealed trai
  • 正确使用术语 Monoid

    从下面的例子来看 我认为这样的说法是正确的String在串联运算下定义了一个幺半群 因为它是关联二元运算 并且String碰巧有一个身份元素 它是一个空字符串 scala gt Jane Doe Jane Doe res0 Boolean
  • Scala 的“神奇”函数列表

    在哪里可以找到 Scala 的 神奇 函数列表 例如apply unapply update etc 魔法函数是指编译器的某些语法糖使用的函数 例如 o update x y lt gt o x y 我用谷歌搜索了一些组合scala mag
  • 实现只有一个居民的类型的价值

    感谢 MilesSabin 的answer https stackoverflow com a 32157259 867671我可以编写类型级别的斐波那契序列 sealed trait Digit case object Zero exte
  • 过滤器的 Scala 集合类型

    假设您有一个 List 1 1 其类型为 List Any 这当然是正确的且符合预期 现在如果我像这样映射列表 scala gt List 1 1 map case x Int gt x case y String gt y toInt 结
  • 如何将 Dataframe 列名称与 Scala 案例类属性相匹配?

    本示例中的 Spark sql 列名来自case class Person case class Person name String age Int val people RDD Person An RDD of case class o
  • HDFS:使用 Java / Scala API 移动多个文件

    我需要使用 Java Scala 程序移动 HDFS 中对应于给定正则表达式的多个文件 例如 我必须移动所有名称为 xml从文件夹a到文件夹b 使用 shell 命令我可以使用以下命令 bin hdfs dfs mv a xml b 我可以
  • 解决 sbt 中 jar 加载冲突的问题

    当两个特定的 sbt 插件启动时 我在 sbt 启动时收到以下错误加在一起到其构建定义中的项目 这些 sbt 插件之一是规模化jdbc https github com scalikejdbc scalikejdbc另一个是my own h

随机推荐

  • golang如何实时测试http服务器?

    我使用 gotests 和 gorilla mux 并且我可以对我的 http handlerfunc 处理程序进行单元测试 但它们不会响应正确的 http 请求方法 因为它们应该在 gorilla mux 下响应 我如何进行 实时服务器
  • Pandas:计算组上的时间间隔交叉点

    我有以下形式的数据框 import pandas as pd Out 1 df pd DataFrame id 1 2 3 4 5 group A A A B B start 2012 08 19 2012 08 22 2013 08 19
  • Jenkins:允许本地结账

    这是我第一次使用詹金斯 我创建了一个只有一个文件的新文件夹 并在其中创建了一个 git 存储库 然后我使用该存储库设置 Jenkins 我现在得到的是这个错误 错误 Git 远程 path hello 的签出已中止 因为它 引用本地目录 这
  • 使用 CodeIgniter 更新批次

    我正在尝试使用 CodeIgniter 制作一个小型开放式 CMS 现在正在研究类别系统 我真的很困惑 经过多次尝试和论坛帖子后我没有解决它 我有 2 个 mySQL 表 1 ft categories 列出所有类别的名称 包含 2 个字段
  • 如何在 Laravel 中创建临时表

    如何在laravel中创建临时表 插入记录并检索 你好 我正在尝试在 laravel 中创建一个临时表并插入一条记录并从临时表中检索该记录 然后删除该表 但我的临时表没有创建 DB raw CREATE TEMPORARY TABLE tb
  • Spring Data JPA“OR”与单个参数

    是否可以有一个像这样的 Spring Data JPA 存储库方法 User findByEmailOrUserName String usernameOrEmail 上面的方法名称不起作用 因为 Spring Data JPA 在尝试查找
  • 如何在 Ruby 中递增/递减一个字符以获取所有可能的值?

    我有一个长度为一个字符的字符串 可以是任何可能的字符值 irb main 001 0 gt x0 gt u0000 我认为这可能有效 irb main 002 0 gt x0 1 SyntaxError irb 2 syntax error
  • v-for 项目内部的切换会影响整个列表,如何使每个切换仅影响包含的列表项目?

    我正在使用 v for 循环制作一个项目列表 在循环的每个项目内都有一个带有单击事件方法的按钮 显示描述文本 当我单击按钮时 它应该仅在其自己的项目内部切换 但它会影响 v for 列表中的所有元素 那么 如何制作一个只影响其自身项目的切换
  • 在windows上安装scipy时出错

    我正在 Windows 机器和 2 7 版本的 python 上工作 我已经安装了 numpy 现在我正在尝试安装 scipy 我尝试使用简易安装命令并下载 zip 文件然后运行 setup py 文件来安装它 当我尝试通过 easy in
  • 如何在 Cordova Android 应用程序中嵌入 Youtube 视频

    我是 Cordova 应用程序开发的新手 我有一个 Youtube URL 我想将视频嵌入到 Cordova 应用程序中 我尝试过使用 YouTube Api JS 库 和 iframe 来制作它 我需要做什么才能在 Android 应用程
  • Chrome iFrame 阻止 HTTPS 重定向

    我有一个父网站 https a company com 其中包含一个带有 HTTPS 内容的 iframe https b company com foo 到目前为止一切都很顺利 但是 当发生重定向以在同一域上加载不同的路由时 Chrome
  • 如何使用 OpenGL 3.x VBO 渲染动态世界?

    尽管 OpenGL 3 x 本身的最新参考文献似乎很少 但 OpenGL 的实际低级操作相对简单 然而 我在试图概念化如何操纵 VBO 来渲染动态世界时遇到了严重的困难 显然旧的立即模式方式不适用 但是从那里我该去哪里呢 我是否编写某种场景
  • 单例模式的替代方案?

    我使用 ASP NET 和 C 担任 Web 开发人员已经有一段时间了 我想尝试通过使用最佳实践来提高我的技能 我有一个网站 我想一次性加载设置 然后在需要的地方引用它 所以我做了一些研究 50 的开发人员似乎正在使用单例模式来做到这一点
  • 如何通过用户的XAML动态添加控件到UserControl?

    我想创建一个包含 TextBlock 和 StackPanel 的用户控件 该控件将允许用户在 XAML 中动态地将他 她自己的控件添加到用户控件 以下是我的 UserControl 的示例 XAML
  • 如何从进程 ID 获取 X11 窗口?

    在 Linux 下 我的 C 应用程序使用 fork 和 execv 来启动 OpenOffice 的多个实例 以便查看一些 powerpoint 幻灯片 这部分有效 接下来 我希望能够将 OpenOffice 窗口移动到显示屏上的特定位置
  • 使用 NumPy datetime64 进行矢量化年/月/日运算

    我想从年 月和日的一维向量创建 NumPy datetime64 对象的向量 并且还可以反向操作 即从每日 datetime64 向量中提取年 月或日的向量 我正在使用 NumPy 1 7 0b2 例如 假设 years 1990 1992
  • 使用 RxJava 和 Retrofit 链接两个 Web 服务调用

    我正在使用 RxJava 和 Retrofit 我的基本要求是 我想链接两个 api 调用 这将被一个接一个地调用 从第一个 api 收到的响应在调用第二个 api 时用作输入 在阅读了互联网上的一些内容后 我用平面图来实现这一点 在执行此
  • Rails - 连接后 Distinct ON

    我正在使用 Rails 4 2 和 PostgreSQL 我有一个Product模型和一个Purchase模型与Product has many Purchases 我想找到最近购买的独特产品 最初我尝试过 Product joins pu
  • Google Apps 脚本 - 获取用户电子邮件地址

    我有一个在 Google 网站上运行的 Google Apps 脚本项目 该网站要求用户登录 并且仅向该 G suite 域中的用户开放 我拥有的脚本用于允许用户进行投票 进入发言者队列以及执行一些其他任务 目前 后台的所有功能都可以作为我
  • 解释 Scala 类型级编程中使用的“LowPriorityImplicits”模式

    当查看一些 Scala 库的源代码时 例如无形的 我经常发现名为LowPriorityImplicits 您能解释一下这个模式吗 解决的问题是什么 该模式是如何解决的 该模式允许您拥有隐式层次结构 避免编译器产生与歧义相关的错误 并提供一种