【问题标题】:Scala GADT Skolem Playframework 2.1 compile error.Scala GADT Skolem Playframework 2.1 编译错误。
【发布时间】:2012-12-09 01:26:25
【问题描述】:

有没有人有处理这些类型的编译错误的经验?

case class BasicAuthRequest[A](account: Account, request: Request[A]) extends WrappedRequest(request) {
    def asOpt[T](implicit fjs: Reads[T]): Option[T] = {
        catching(classOf[RuntimeException]).opt(fjs.reads(JsNull)).filter {
        case JsUndefined(_) => false
        case _ => true
    } }
}

我在尝试编译这个 playframework 方法时从 scala 编译器得到这个响应

[error]  found   : play.api.libs.json.JsUndefined
[error]  required: play.api.libs.json.JsResult[?T1] where type ?T1 <: T (this is a GADT skolem)
[error]         case JsUndefined(_) => false
[error]              ^
[error] one error found
[error] (compile:compile) Compilation failed
[error] Total time: 23 s, completed Nov 27, 2012 3:01:20 AM

【问题讨论】:

    标签: scala playframework playframework-2.1


    【解决方案1】:

    fjs.reads(JsNull) 返回 JsResult[T] 然后通过 opt 包装到 Option 中

    所以这段代码有几个问题:

    • 返回类型应为 Option[JsResult[T]]
    • JsUndefined 不是 JsResult 的子类,所以不能在 match 中使用
    • 编译器错误消息确实很神秘,您介意向 scala tracker 提交问题吗?

    这是我认为您尝试实现的代码

      case class Account()
    
      case class BasicAuthRequest[A](account: Account, request: Request[A]) extends WrappedRequest(request) {
        def asOpt[T](implicit fjs: Reads[T]): Option[T] =
          scala.util.control.Exception.catching(classOf[RuntimeException]).opt(fjs.reads(JsNull)).flatMap(_.asOpt)
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-12
      • 2021-03-21
      • 1970-01-01
      • 1970-01-01
      • 2012-12-21
      • 1970-01-01
      相关资源
      最近更新 更多