我想要一个类型的方法来返回它混入的类型。例如,具有以下精神的东西:
trait A {
def withoutA: this.type without A
}
因此,如果是A with B with C
类型,方法withoutA
会有B with C
的签名A with D
- 只有D
。
这是可以实现的吗?如果可以的话?
以下是如何使用它的示例:
trait Limit {
def limit(a: Int): this.type without Limit
}
trait Offset {
def offset(a: Int): this.type without Offset
}
val sqlBuilder = new Limit with Offset { ... }
sqlBuilder.limit(2).offset(4) // valid code
sqlBuilder.offset(4).limit(2) // valid code
sqlBuilder.limit(2).limit(4) // invalid code
答案 0 :(得分:1)
在黑暗中刺伤,但是否定类型as defined by shapeless可能会在这里起作用。
type ¬[A] = A => Nothing
trait A {
def withoutA: this.type with ¬[A]
}
现在没有访问REPL,我没有机会测试这个。我也有兴趣知道用例。
更新:
如果你真正想要的是一个在你使用时逐渐减少可用操作的构建器,那么幻像类型和类型安全构建器模式就可以解决了:
http://james-iry.blogspot.co.uk/2010/10/phantom-types-in-haskell-and-scala.html
http://blog.rafaelferreira.net/2008/07/type-safe-builder-pattern-in-scala.html
您可能还想更新问题的标题,以便其他人更容易找到:)