Scala 将使用宏的ADT基逻辑抽象为trait
我最近偶然发现了特拉维斯·布朗的一段相当棒的代码。它通过允许ADT“构造函数”(用Haskell的术语)的枚举,将Scala基于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
的密封特征
+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解决这个问题,并遇到了一些问题。