我正在尝试在Miles Sabin的博客文章中定义的Scala的联合类型:
http://www.chuusai.com/2011/06/09/scala-union-types-curry-howard/
并在中讨论过
对于那里定义的简单情况,它们工作正常,但我要做的是使用它们在Play Framework中创建一个只接受某些值(String,Boolean,Int,Undefined)的通用JSON解析器,然后成功传递它们.
这是我的代码:
type UpdateType = Option[String] |?| Option[Int] |?| Option[Boolean] |?| Option[List[Int]]
def withValue[T : (UpdateType)#?](request: Request[JsValue])(block: (String, T) => Future[SimpleResult]) = {
val field = request.body \ ("field")
val value = request.body \ ("value")
(field, value) match {
case (x: JsString, y: JsString) => block(x.value.toString, Some(y.value.toString))
case (x: JsString, y: JsNumber) => block(x.value.toString, Some(y.value.intValue))
case (x: JsString, y: JsBoolean) => block(x.value.toString, Some(y.value.booleanValue))
case (x: JsString, y: JsUndefined) => block(x.value.toString, None)
case _ => Future.successful(BadRequest(s"Incorrect field, value pair for ${request.body}."))
}
}
Run Code Online (Sandbox Code Playgroud)
然后我想以这种方式使用它:
def update(code: String) = Action.async(parse.json) {
request =>
withValue(request) { (field, value) =>
// Code that does something with the value
Future(Ok)
}
}
Run Code Online (Sandbox Code Playgroud)
但我的withValue函数给出了编译错误:
[error] found : Some[String]
[error] required: T
[error] case (x: JsString, y: JsString) => block(x.value.toString, Some(y.value.toString))
Run Code Online (Sandbox Code Playgroud)
不应该是UpdateType,它应该接受某些[String]或者有什么东西我没有到达这里?
知道我能在这里做些什么才能让这些工作或者有可能吗?我对Scala中更高级的类型和类型lambda非常陌生,但我正在尝试学习如何创建更多类型安全的代码.
我还注意到,Miles Sabin有一个名为Shapeless的图书馆(https://github.com/milessabin/shapeless),我正在调查,但找不到任何可以做同样事情的图书馆,我正在努力实现这里.
不幸的是,Sabin的联合类型不能仅用作返回类型.[T : (UpdateType)#?]你的方法的上下文绑定只是一个额外的隐式参数的语法糖(implicit evidence: (UpdateType)#?[T]).此参数是<:<证明的实例,它T是联合类型的某个组件的子类型.编译器必须在方法的调用站点填写参数,为此,它需要知道union类型的哪个组件T.当T其中一个参数的类型时,这不是问题,因为编译器将拥有该类型.当T用作返回类型时,编译器无法知道结果是什么T.更糟糕的是,在方法本身内部,T隐式参数已经一成不变,因此编译器只能接受T作为返回值,并且T只是union类型的一个组件,而不是真正的union类型代表他们中的任何一个.这就是为什么你得到的编译器错误坚持Some[String]不能用作T.
没有任何简单的方法可以解决这个问题,因为Scala并不真正拥有联合类型.正如我在问题的评论中提到的那样,有一个简单的OO解决方案,尽管有更多样板.
| 归档时间: |
|
| 查看次数: |
1002 次 |
| 最近记录: |