依赖方法类型以前曾是一个实验性功能,现在默认情况下已在中继中启用,显然这似乎在Scala社区中引起了一些兴奋.
初看起来,这并不是显而易见的.Heiko Seeberger在这里发布了一个简单的依赖方法类型示例,从评论中可以看出,可以很容易地在方法上使用类型参数进行复制.所以这不是一个非常引人注目的例子.(我可能会遗漏一些明显的东西.如果是这样,请纠正我.)
对于依赖方法类型的用例有哪些实用且有用的例子,它们明显优于替代方法?
我们可以用以前不可能/容易的事情做些什么有趣的事情?
他们通过现有的类型系统功能为我们买了什么?
此外,依赖方法类型是否类似于或从其他高级类型语言(如Haskell,OCaml)的类型系统中找到的任何功能中汲取灵感?
haskell type-systems programming-languages scala dependent-method-type
我正在使用Jersey JAX-RS参考实现在Scala中开发REST Web服务,我遇到了一个奇怪的错误.
我正在尝试使用ContentDisposition.ContentDispositionBuilder创建ContentDisposition对象.
ContentDisposition.ContentDispositionBuilder有两种类型T extends ContentDisposition.ContentDispositionBuilder和V extends ContentDisposition.该方法type的ContentDisposition返回建设者实例.
代码
val contentDisposition = ContentDisposition.`type`(MediaType.APPLICATION_OCTET_STREAM).build()
Run Code Online (Sandbox Code Playgroud)
然而有效
val contentDisposition = ContentDisposition.`type`(MediaType.APPLICATION_OCTET_STREAM).fileName("dummy").build()
Run Code Online (Sandbox Code Playgroud)
产生编译错误
error: value build is not a member of ?0
val contentDisposition = ContentDisposition.`type`(MediaType.APPLICATION_OCTET_STREAM).fileName("dummy").build()
^
Run Code Online (Sandbox Code Playgroud)
(注意,type需要将其放在"引号"中,因为它是Scala中的关键字)
fileName中ContentDispositionBuilder返回的实例T所以这应该实际工作.
我不懂.任何的想法?我顺便使用Scala 2.9.0.1.
更新:
这有效.但为什么我需要这里的铸造?
val contentDisposition = ContentDisposition.`type`(MediaType.APPLICATION_OCTET_STREAM)
.fileName("dummy")
.asInstanceOf[ContentDisposition.ContentDispositionBuilder[_,_]]
.build()
Run Code Online (Sandbox Code Playgroud)