小编Nie*_*nAI的帖子

获取密封特征的子类

是否有可能(通过宏,某种形式的无形自动或其他形式)获得密封特征的子类列表:

  • 在编译时?
  • 在运行时?

scala shapeless scala-macros scala-reflect

14
推荐指数
1
解决办法
4459
查看次数

展平密封的案例类层次结构

假设我有一个密封的案例类层次结构,如下所示:

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的特定结构?

scala shapeless

7
推荐指数
1
解决办法
450
查看次数

寻找“自由定理”

我如何推导出该类型的自由定理:

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 版本下编译都太老了。

haskell free-theorem

2
推荐指数
1
解决办法
130
查看次数

Spray JSON无法序列化案例类

我正在尝试使用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)

这行得通,但我仍然悬而未决,因为尚不清楚为什么有必要这样做。

json scala spray

0
推荐指数
1
解决办法
226
查看次数