“没有”某种类型的抽象签名

时间:2014-01-25 11:34:15

标签: scala mixins

我想要一个类型的方法来返回它混入的类型。例如,具有以下精神的东西:

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

1 个答案:

答案 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

您可能还想更新问题的标题,以便其他人更容易找到:)