Scala 将使用宏的ADT基逻辑抽象为trait

Scala 将使用宏的ADT基逻辑抽象为trait,scala,macros,dry,abstract-data-type,scala-2.11,Scala,Macros,Dry,Abstract Data Type,Scala 2.11,我最近偶然发现了特拉维斯·布朗的一段相当棒的代码。它通过允许ADT“构造函数”(用Haskell的术语)的枚举,将Scala基于的密封特征+case类/对象的ADT转变为更接近真实枚举的ADT。因此,我删除了Travis代码产生的3个弃用警告中的2个,并最终使用了以下警告: sealed trait KeywordType case object Crime extends KeywordType case object Gambling extends KeywordType case obj

我最近偶然发现了特拉维斯·布朗的一段相当棒的代码。它通过允许ADT“构造函数”(用Haskell的术语)的枚举,将Scala基于
的密封特征
+
case类/对象
的ADT转变为更接近真实枚举的ADT。因此,我删除了Travis代码产生的3个弃用警告中的2个,并最终使用了以下警告:

sealed trait KeywordType
case object Crime extends KeywordType
case object Gambling extends KeywordType
case object Porn extends KeywordType

object KeywordType {
  /** Maps e.g. "Crime" to Crime */
  def withName(x: String): Option[KeywordType] =
    adt.enumerate[KeywordType].find(_.toString === x)
}
但是,我很快需要使用name逻辑重用相同的
位,因此我尝试编写以下
ADT
基本特征:

trait ADT[T] {
  def all: Set[T] = enumerate[T]

  def withName(name: String): Option[T] =
    all.find(_.toString === name)
}
但是,这并不意味着:

Can only enumerate values of a sealed trait or class
虽然我理解为什么会发生此错误,但对于如何告诉类型系统“推迟”该检查,直到实际从
ADT
继承某个内容,我没有任何线索


对于Scala 2.11.2中的当前宏系统,这可能吗?或者我必须找到一个(部分)解决方案吗?

值得一提的是,我只是尝试以一种更具原则性的方式使用Shapess解决这个问题,并遇到了一些问题。