Scala 类型级别减号

标签 scala types

有没有办法,如何在类型上表达减号运算符?我希望能够实现这一目标:

trait A
trait B
type C = A with B
type D = C minus A
// type B == D

我知道,这不能直接完成,但也许有人能够用一些巧妙的技巧来表达这个运算符......

---编辑

动机:

trait A
object B extends A
object C extends A
object D extends A
def myMethod(one:A,two:A,three:A) = ???

每个类型只能使用一次,所以当此方法的用户选择B作为one参数时,使用C<是有效的D 在其他参数...

最佳答案

有两个不同的问题 — 我只回答这样的用例:如果您两次传递同一个对象,您希望调用 myMethod 失败。对于前四行,请参阅 Miles Sabin’s answer Peter Schmitz 链接的问题。

trait =!=[A, B]
implicit def neq[A, B]: A =!= B = null
implicit def neqAmbig1[A]: A =!= A = null
implicit def neqAmbig2[A]: A =!= A = null

trait A
object B extends A
object C extends A
object D extends A
def myMethod[A, B, C](one: A, two: B, three: C)(implicit ev1: A =!= B, ev2: A =!= C, ev3: C =!= B) = ???

关于Scala 类型级别减号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16714486/

相关文章:

c# - C++ ULONG 定义到 VB.NET 或 C# 等价物?

java - 具有引用和原始类型的 isAssignableFrom

scala - 使用 sbt 加载 github 项目时发生 AttributeKeyID 冲突

Scala 宏 : What is the difference between typed (aka typechecked) and untyped Trees

scala - scala_home homebrew 在 OSX 上安装在哪里?

scala - 如何将我的Spray API部署到生产中?

list - 在 Haskell 中格式化列表输出?

regex - 在 Movable Type 模板中使用正后视会导致错误,因为 < in pattern string

haskell - 在 Haskell 中使用 Data.Reflection 时由于类型不明确而无法显示

scala 代码函数式编程整容 : extracting String from List[List[myClass. toString]] 结构