【问题标题】:Suspicious Shadowing by a Type Parameter while defining Scala 3 Type Class定义 Scala 3 类型类时类型参数的可疑阴影
【发布时间】:2023-02-02 14:43:25
【问题描述】:

我正在尝试围绕 XML 解析器实现一些小的生活质量改进,基本上是试图模仿 Circe 在 Scala 中解析 Json 的方式。 然后的想法是按照这些思路提出一个类型类定义

type ParseResult[T] = ???

trait XMLCodec[T]:
  extension(t: T)
    def toXML: Elem

  extension(xml: Elem)
    def as[T]: ParseResult[T]  // <- this fails to compile

除此之外,如标题所述,我得到一个Suspicious Shadowing by a Type Parameter

我当然可以从该行中删除 [T]

trait XMLCodec[T]:
  //...

  extension(xml: Elem)
    def asObject: ParseResult[T]  // <- works fine

以上很好,但我担心在任何给定上下文中存在同一类型类的多个实现时名称冲突。 有没有一种简单的方法可以解决我所缺少的问题?

【问题讨论】:

标签: scala functional-programming extension-methods typeclass scala-xml


【解决方案1】:

如果as[T] 有自己的独立于XMLCodec[T] 类型参数的类型参数,那么将扩展方法as[T] 放在类型类XMLCodec[T] 中的原因是什么?

也许你可以有一个类型类

trait XMLCodec[T]:
  extension (t: T)
    def toXML: Elem

  def toParseResult(xml: Elem): ParseResult[T]

和一个独立的扩展方法

extension (xml: Elem)
  def as[T](using codec: XMLCodec[T]): ParseResult[T] = codec.toParseResult(xml)

【讨论】:

  • 是的,这样做了。事后看来很明显。谢谢!
猜你喜欢
  • 1970-01-01
  • 2023-02-14
  • 2012-04-11
  • 2021-06-22
  • 1970-01-01
  • 2011-01-04
  • 1970-01-01
  • 2021-07-25
  • 1970-01-01
相关资源
最近更新 更多