【问题标题】:Scala type class for obtaining the most concrete type for a type memberScala 类型类,用于获取类型成员的最具体类型
【发布时间】:2017-04-24 20:39:25
【问题描述】:

考虑以下 Scala 代码:

trait Elem
class MyElem extends Elem

trait Holder {
  type EP <: Elem
  def get: EP
}

class MyHolder(e: MyElem) extends Holder {
  type EP = MyElem
  def get = e
}

根据我的对象类型是 Holder 还是 MyHolder,调用 get 可能会分别返回 ElemMyElem。我正在尝试在类型级别提供该信息,但我没有得到任何结果。例如,考虑像这样的Getter 类型类:

trait Getter[From] {
  type Out
  def get(from: From): Out
}

object Getter {
  type Aux[From, Out0] = Getter[From] { type Out = Out0 }

  def apply[From](implicit getter: Getter[From]): Getter.Aux[From, getter.Out] = getter

  // some way to create a `Getter[H <: Holder]`
  // where `Out` is the most specific type known for `H#EC`
}

Getter[MyHolder] // should return a MyHolder { type Out = MyElem }
Getter[Holder] // should return a Holder { type Out = Elem }

我正在尝试为 sn-p 中缺少的 Getter[H &lt;: Holder] 创建隐式构造函数,但即使我尝试了几种限制类型的方法,我也没有得到适用于上述两个示例的任何结果。

这可能与 Scala 编译器有关吗? shapelessscalaz 的任何类型类可以帮助我做到这一点吗?

【问题讨论】:

    标签: scala scalaz shapeless


    【解决方案1】:

    你的问题听起来像是Path Dependent Types的应用程序

    你可以在不知道具体实现的情况下根据某个 trait/class 中定义的类型键入一些内容:

    val x: Holder#EP = ???
    

    我希望这是您正在寻找的,如果不是,恐怕我不完全理解您的问题。

    【讨论】:

    • 你好,查尔斯。我已经考虑过使用路径相关类型,它们可用于解决问题中的问题。不幸的是,它们不适用于我的具体问题,因为它比我在这里给出的示例稍微复杂一些。尽管如此,如果您改进您的响应以提供上述问题的实现,并简要说明,我愿意在这里接受您的回答。
    猜你喜欢
    • 1970-01-01
    • 2011-01-08
    • 2021-10-15
    • 1970-01-01
    • 2012-02-10
    • 2018-10-01
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    相关资源
    最近更新 更多