是否有一个类型类可以检查至少一个隐式类型的存在?

2023-12-01

我有一个特质Foo[T, U]和一个类型级算法,给出L <: HList和目标类型U,告诉我是否存在T in L这样就存在一个隐含的Foo[T, U]在适用范围。这是使用以下类型类实现的:

trait Search[L <: HList, U]

object Search {
  def apply[L <: HList, U](implicit s: Search[L, U]): U = null

  ...
}

我们有以下内容:

object Test {
  type L = Int :: String :: HNil

  implicit val foo: Foo[String, Boolean] = null

  Search[L, Boolean] //compiles

  Search[L, Double] //does not compile
}

我希望的是,如果没有,则根本不会进行搜索Foo[T, U]对于任何T完全在范围内,因为那时我们已经知道该算法将无法完成。换句话说,我想要一个类型类trait Exists[F[_]]对于哪些实例存在当且仅当存在至少一个隐式F在范围内,所以函数Search.apply相反有签名:

def apply[L <: HList, U](implicit ev: Exists[Foo[_, U]], s: Search[L, U]): U = null

在这种情况下,编译器只会尝试解析s如果有任何隐含的Foo在适用范围。

这样的类型类可以定义吗?已经存在吗?


Try

import scala.language.experimental.macros
import scala.reflect.macros.{blackbox, contexts}

trait Exists[A]

object Exists {
  implicit def materialize[A]: Exists[A] = macro impl[A]

  def impl[A: c.WeakTypeTag](c: blackbox.Context): c.Tree = {
    import c.universe._
    val context = c.asInstanceOf[contexts.Context]
    val global: context.universe.type = context.universe
    val analyzer: global.analyzer.type = global.analyzer
    val callsiteContext = context.callsiteTyper.context

    val tpA = weakTypeOf[A]

    val searchResult = analyzer.inferImplicit(
      tree = EmptyTree.asInstanceOf[global.Tree],
      pt = tpA.asInstanceOf[global.Type],
      reportAmbiguous = false,
      isView = false,
      context = callsiteContext,
      saveAmbiguousDivergent = true,
      pos = c.enclosingPosition.asInstanceOf[global.Position]
    )

    val isAmbiguous = callsiteContext.reporter.firstError match {
      case Some(analyzer.AmbiguousImplicitTypeError(_,_)) => true
      case _ => false
    }

    if (searchResult.isSuccess || searchResult.isAmbiguousFailure || isAmbiguous) 
      q"new Exists[$tpA] {}"
    else c.abort(c.enclosingPosition, s"no implicit $tpA")    
  }
}

Test

// no implicit Int
// implicitly[Exists[Int]] // doesn't compile
implicit val i: Int = 1 
implicitly[Exists[Int]] // compiles
implicit val i: Int = 1 
implicit val i1: Int = 2 
implicitly[Exists[Int]] // compiles

我猜是原创的Search was

trait Foo[U, V]

trait Search[L <: HList, V]

trait LowPrioritySearch {
  implicit def tail[H, T <: HList, V](implicit search: Search[T, V]): Search[H :: T, V] = null
}

object Search extends LowPrioritySearch {
  def apply[L <: HList, U](implicit s: Search[L, U]): U = null.asInstanceOf[U]

  implicit def head[U, T <: HList, V](implicit foo: Foo[U, V]): Search[U :: T, V] = null
}

现在与Exists

def apply[L <: HList, U](implicit ev: Exists[Foo[_, U]], s: Search[L, U]): U = null.asInstanceOf[U]

也有效

Search[L, Boolean] //compiles
// Search[L, Double] //does not compile

在2.13.0中测试

libraryDependencies ++= Seq(
  scalaOrganization.value % "scala-reflect" % scalaVersion.value,
  scalaOrganization.value % "scala-compiler" % scalaVersion.value
)

Exists2.13.10 仍在工作。

Scala 3 中有一个 API 可以实现这一点

import scala.quoted.{Type, Quotes, Expr, quotes}

trait Exists[A]

object Exists {
  inline given [A]: Exists[A] = ${impl[A]}

  def impl[A: Type](using Quotes): Expr[Exists[A]] = {
    import quotes.reflect.*

    Implicits.search(TypeRepr.of[A]) match {
      case _: (ImplicitSearchSuccess | AmbiguousImplicits) => '{new Exists[A]{}}
      case _ => report.errorAndAbort(s"no implicit ${Type.show[A]}")
    }
  }
}
// no implicit Int
// summon[Exists[Int]] // doesn't compile
given Int = 1
summon[Exists[Int]] // compiles
given Int = 1
given i: Int = 2
summon[Exists[Int]] // compiles

斯卡拉 3.2.0。

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

是否有一个类型类可以检查至少一个隐式类型的存在? 的相关文章

  • Spark SQL 失败,因为“常量池已超过 JVM 限制 0xFFFF”

    我在 EMR 4 6 0 Spark 1 6 1 上运行此代码 val sqlContext SQLContext getOrCreate sc val inputRDD sqlContext read json input try inp
  • 高效序列化案例类

    对于我正在工作的图书馆 我需要提供一个高效 便捷 typesafe序列化 scala 类的方法 理想的情况是用户可以创建一个案例类 并且只要所有成员都是可序列化的 它似乎也应该如此 我准确地知道序列化和反序列化阶段的类型 因此不需要 也不能
  • 对两种类型之间的二元关系进行建模

    有企业 也有人 用户可以对某个企业点赞或发表评论 但效果是一样的can not发生在一个人身上 当用户发布有关某个企业的内容或对其点赞时 该企业就被称为target喜欢或帖子 trait TargetingRelation Targetin
  • 具有上限的联合类型

    我正在遵循这个问题的公认答案中提出的技术如何定义 类型析取 联合类型 https stackoverflow com questions 3508077 does scala have type disjunction union type
  • 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
  • Java 8 Stream,获取头部和尾部

    Java 8 引入了Stream http download java net jdk8 docs api java util stream Stream html类似于 Scala 的类Stream http www scala lang
  • Scala Spark 包含与不包含

    我可以使用 contains 过滤 RDD 中的元组 如下所示 但是使用 不包含 来过滤 RDD 又如何呢 val rdd2 rdd1 filter x gt x 1 contains 我找不到这个的语法 假设这是可能的并且我没有使用Dat
  • Scala 使用的 Redis 客户端库建议

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

    我正在开发一个 Scala 程序 该程序调用 Java 库中的函数 处理结果并生成 CSV 有问题的 Java 函数如下所示 Map
  • 正确使用术语 Monoid

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

    我试图理解以下代码 来自 Scalaz 库 def kleisliIdApplicative R Applicative Kleisli Id R 我假设一种形式T P0 是一个带有参数的类型构造函数 但是我无法找到解释类型参数中问号用法的
  • IntelliJ IDEA 能否正确格式化 scala.html 文件以及如何启用它?

    IntelliJ IDEA 12 Ultimate 和 CE 格式化我的 main scala html 文件中的以下行 在 Play 应用程序中 main css gt As main css gt 是的 真的 它分解了带引号的字符串 我
  • 当泛型类型与无界通配符一起使用时,不考虑类型参数绑定

    在我的项目中 我有一个这样的星座 trait F trait X A lt F def test x X X lt F x Trait X有一个类型参数 其上限为F 根据我的理解 类型X and X lt F 应该是等价的 但scalac2
  • 如何在 Lift 框架中添加新页面

    如何在 lift 中的 webapp 目录中添加一个可供用户访问的新页面 目前只能通过index html访问http localhost 8080 com http localhost 8080 or http localhost 808
  • Spark:查找前 n 个值的高性能方法

    我有一个很大的数据集 我想找到具有 n 个最高值的行 id count id1 10 id2 15 id3 5 我能想到的唯一方法是使用row number没有分区就像 val window Window orderBy desc coun
  • 用于共享大型不可变对象的工厂/缓存策略

    我的问题很像上一篇文章最佳哈希集初始化 Scala Java https stackoverflow com questions 14714900 optimal hashset initialization scala java 我想用的
  • 将下划线分配给变量。下划线是做什么的?

    最近我遇到了这样的代码 var myVariable variableKind 这似乎是一种分配方式null to myVariable 谁能解释一下背后的理由 在这种情况下 分配之间有什么区别 and null到一个变量 它使用默认值初始
  • 类型级别集结合律的证明

    我试图证明类型级函数Union https hackage haskell org package type level sets 0 8 5 0 docs Data Type Set html t Union是关联的 但我不确定应该如何完
  • 你能在 scala 中使用 varargs 柯里化一个函数吗?

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

随机推荐

  • R:4D 绘图、x、y、z、颜色

    你能给我一个关于如何使用 rgl 在 x y 和 z 轴上绘制 3 个变量以及使用不同颜色绘制第四个变量的示例吗 thanks 您使用以下组合persp和颜色根据单独的功能 这是一些示例代码 Create a simple surface
  • Java 桌面应用程序的内存分析

    我的应用程序加载了大约的数据集 每次 85bm 至 100mb 应用程序的内存限制设置为 512mb 理论上来说 这已经足够了 然而 我发现 如果在应用程序的单次运行中 我打开和关闭数据集 5 次 总内存消耗会稳步增加 直到出现内存不足错误
  • 保存登录详细信息(首选项)android

    我有一个带有登录 注销功能的Android应用程序 登录表单包含用户名和密码以及登录按钮 我想在用户选中 记住我 复选框时保存用户名和密码 我的project java文件如下所示 public class project extends
  • REACT- DOM 突变警告含义

    违规 向 DOMNodeInserted 事件添加了同步 DOM 突变侦听器 考虑使用 MutationObserver 来使页面响应更快 关于此警告还有另一个问题 我已经在那里回答了解决该问题的方法 这不是这个问题的原因 对于那些想知道的
  • 如何与我的应用程序共享选定的文本?

    我想让我的应用程序出现在 UIActivityViewController 中以进行文本共享 例如邮件 iMessage Notes Gmail 等 例如 当用户点击所选文本并从任何应用程序中点击 共享 按钮 如附件中所示 时 我希望我的应
  • 占位符混合 SCSS/CSS

    我正在尝试为 sass 中的占位符创建一个混合 这是我创建的 mixin mixin placeholder css webkit input placeholder css moz placeholder css moz placehol
  • REGEX 查找特定子字符串(如果不是单词的一部分)

    我在简化我创建的正则表达式时遇到了麻烦 sept a zA Z sept a zA Z a zA Z sept sept a zA Z 该正则表达式必须找到子字符串sept 这不是任何单词的一部分 例如 september 当应该找到单词时
  • 如何在 Python 中将数组数组转换为多维数组?

    我有一个 NumPy 数组 长度为 X 所有数组都具有相同的长度 Y 但其类型为 对象 因此具有维度 X 我想将其 转换 为具有成员数组元素类型 float 的维度 X Y 数组 我能看到做到这一点的唯一方法是 手动 使用类似的东西 x f
  • 气氛/泽西岛双向对话

    我见过许多 Atmosphere 示例 包括 pub sub 我想做类似 pub sub 的事情 客户端订阅该客户端唯一的通道 服务器定期发布到该通道 只不过客户端也会将数据发送到服务器 客户端将发送数据以响应服务器发送的数据 以及在其他情
  • 如何以编程方式从 Android 中的 .vcf 文件导入或插入联系人?

    我创造 vcf使用以下代码保存 Android 中所有联系人的文件 public static void getVCF final String vfile POContactsRestore vcf Cursor phones mCont
  • Tomcat SSL:无法找到请求目标的有效证书路径

    我正在尝试访问应用程序中的网址 但收到此错误 1771426 http bio 8180 exec 15 ERROR gadget GadgetValidatorServlet wsdl exception WSInvokerExcepti
  • 禁用自动更正 UITextView

    有谁知道如何禁用 uitextview 中的自动更正编程 我有以下代码 但它不起作用 void setUpTextView self textView UITextView alloc initWithFrame self bounds s
  • order() 的结果应用于 data.frame 与 data.table 时有所不同

    如果我使用 我会得到不同的结果order in data frame and data table 例如 A lt data frame one c k two c 3 28 31 60 48 68 B lt as data table A
  • 派生类型声明中的错误:此上下文中 (1) 处的变量必须是常量

    我在模块中声明了一个派生类型 如下所示 MODULE dmotifs TYPE PRM INTEGER PRIVATE nsp 4 nrx 8 maxprx 4 REAL PRIVATE cref 1e 6 tref 1 REAL DIME
  • GET 进程 CPU 使用情况

    我如何获取c中进程的CPU使用情况 我需要每个进程和线程的 CPU 使用情况 请举个例子 Thanks 在普通 C 中 这是不可能的 但由于问题也被标记为 Windows CPU 使用率是 CPU 时间除以实时时间 这获取线程时间 and
  • 分析每个类的垃圾收集对象实例的数量

    我正在寻找一个可以提供有关活动对象的类似 VisuaVM 分析的工具 但在非 GUI 模式下 我所指的 Visual VM 功能可通过转到 Profiler 选项卡并单击 内存 来访问 通过为曾经 1 个对象 所有对象 设置 配置文件对象分
  • asp:RegularExpressionValidator 的正则表达式,格式为 MMddyy(闰年问题)

    我们需要与 asp net asp RegularExpressionValidator 配合使用的正则表达式帮助来验证 MMddyy 格式的日期 我们面临的问题是闰年 问题是 是否可以通过正则表达式验证它只接受有效的闰年日期 例如 02
  • 如何将 Java Long 转换为 Cassandra 的 byte[]?

    懒惰程序员警惕 Cassandra 将列值存储为字节 Java示例 指定一个长类型比较器将这些字节作为 long 进行比较 我想要将 long 的值转换为 Cassandra 友好的 byte 如何 我闲逛了一会 我想你们可以更快地帮助我
  • 当我从同一 ListView 行更新不同的 TextView 时,TextView 滚动正在重置

    我有一个列表视图 对于特定项目 我每秒刷新剩余时间 它工作正常 但我遇到了一个小错误 每当我打电话 duration setText newRemainingValue 要更新该值 同一行中的另一个 textView 会受到影响 这个另一个
  • 是否有一个类型类可以检查至少一个隐式类型的存在?

    我有一个特质Foo T U 和一个类型级算法 给出L lt HList和目标类型U 告诉我是否存在T in L这样就存在一个隐含的Foo T U 在适用范围 这是使用以下类型类实现的 trait Search L lt HList U ob