是否有可能(通过宏,某种形式的无形自动或其他形式)获得密封特征的子类列表:
假设我有一个密封的案例类层次结构,如下所示:
sealed trait Expr
case class Const(val: Double) extends Expr
case class Plus(x: Expr, y: Expr) extends Expr
case class Times(x: Expr, y: Expr) extends Expr
Run Code Online (Sandbox Code Playgroud)
Plus(1,Plus(2,3))转换为HLists的HList?f(e: Expr),即在编译时不知道e的特定结构?我如何推导出该类型的自由定理:
data F a = C1 Nat | C2 Bool Nat a
Run Code Online (Sandbox Code Playgroud)
Nat简单地在哪里data Nat = Z | S Nat?
原则上,这可以通过 Haskell 的“free-theorems”包来回答,但是在我可以合理安装的任何 GHC 版本下编译都太老了。
我正在尝试使用Spray将以下案例类与JSON相互转换:
case class Interval(lower: Int, upper: Int)
Run Code Online (Sandbox Code Playgroud)
这可以通过以下方式实现:
implicit val intervalFormat = jsonFormat2(Interval)
Run Code Online (Sandbox Code Playgroud)
这样可以编译,但是会给出运行时错误:
无法自动确定案例类字段名称和“间隔”的顺序,请使用“ jsonFormat”重载并使用明确的字段名称规范
搜索此错误表明,通常在子类声明其他字段时会出现此错误,此处不是这种情况。
我是否误以为Spray应该能够自动格式化间隔类?
如果是这样,那么(如错误消息所示)我是否应该为格式化程序提供有关Interval字段的更明确的信息?如何最容易实现?
编辑:@retrospectacus的答案提供了一些有用的观点,但是它们都不能解决问题。我采用的解决方法是对字段的类型和名称进行明确描述:
implicit val intervalFormat = jsonFormat[Int, Int,Interval](Interval, "lower", "upper")
Run Code Online (Sandbox Code Playgroud)
这行得通,但我仍然悬而未决,因为尚不清楚为什么有必要这样做。