所以我最近阅读了以下帖子:http://www.chuusai.com/2011/06/09/scala-union-types-curry-howard/
我非常感谢这种做法!我正在尝试制作一个功能
def neq[A,B] = ...
neq [String,String]不能编译,但neq [String,Int]会。看起来这应该是可能的,但我认为我不太了解我们如何使用curry-howard对类型中的逻辑进行编码。
我失败的尝试如下:
我认为我们想要的本质上是一个Xor。所以我们想要
A and ~B or ~A and B
因为在进行隐式解析时scala中的所有内容都是<:<,=:=,所以我想在那里需要一个隐含,因为它是<:<。所以我们说:
~(A and ~B) => (~A and B)
但如果我尝试执行以下操作,则无效:
implicitly[((String with (Int => Nothing)) => Nothing) <:< ((String => Nothing) with Int)]
因为类型根本不匹配而有意义。所以我真的不知道该去哪儿!会喜欢任何指导。
答案 0 :(得分:2)
据我所知,你需要保证A&amp; amp;的不平等。 B(如果我错了,请纠正我)
良好的解决方案(来自Miles Sabin)Shapeless库:
// Type inequalities
trait =:!=[A, B]
def unexpected : Nothing = sys.error("Unexpected invocation")
implicit def neq[A, B] : A =:!= B = new =:!=[A, B] {}
implicit def neqAmbig1[A] : A =:!= A = unexpected
implicit def neqAmbig2[A] : A =:!= A = unexpected
您的neq
方法将如下所示:
def neq[A,B](implicit ev : A =:!= B) = ...
<强>更新强>
XOR:
A and ~B or ~A and B
隐式解决方案不是:
~(A and ~B) <:< (~A and B)
正确的转变是:
(A and ~B) <:!< (~A and B)
or:
(A and ~B) =:!= (~A and B)
比scala代码:
type xor[A, B] = (A with ![B]) =:!= (![A] with B)
def neq[A,B](implicit ev : A xor B) = ...
和测试:
neq[Int, String] // - ok
neq[String, Int] // - ok
//neq[String, String] // - compilation error
//neq[Int, Int] // - compilation error
毕竟,它可以简化为:
A =:!= B