首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用curry howard能够静态地确保两个类型在scala中不相等

使用curry howard能够静态地确保两个类型在scala中不相等
EN

Stack Overflow用户
提问于 2014-07-11 12:15:02
回答 1查看 150关注 0票数 1

所以我最近读了下面这篇令人震惊的帖子:http://www.chuusai.com/2011/06/09/scala-union-types-curry-howard/

我真的很欣赏这种方法!我在试着做一个函数

代码语言:javascript
复制
def neq[A,B] = ...

其中,neqString,String不能编译,但neqString,Int可以。这看起来应该是可能的,但我不认为我对使用curry-howard在类型中编码逻辑的方式有足够深入的理解。

我失败的尝试如下:

我认为我们想要的本质上是Xor。所以我们想要

代码语言:javascript
复制
A and ~B or ~A and B

因为我们在scala中做隐式解析的时候都是像<:<,=:=这样的东西,我想我需要一个隐含在那里,因为那是<:<。所以我们说:

代码语言:javascript
复制
~(A and ~B) => (~A and B)

但是,如果我尝试执行以下操作,这将不起作用:

代码语言:javascript
复制
implicitly[((String with (Int => Nothing)) => Nothing) <:< ((String => Nothing) with Int)]

这是有道理的,因为类型根本不匹配。所以我真的不知道该去哪里!会很乐意得到任何指导。

EN

回答 1

Stack Overflow用户

发布于 2014-07-11 15:29:57

据我所知,你需要保证A和B的不等式(如果我错了,请纠正我)

Shapeless库中的好解决方案(来自Miles Sabin):

代码语言:javascript
复制
// 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方法将如下所示:

代码语言:javascript
复制
def neq[A,B](implicit ev : A =:!= B) = ...

更新:

xor:

代码语言:javascript
复制
A and ~B or ~A and B

按隐式解析不是:

代码语言:javascript
复制
~(A and ~B) <:< (~A and B)

正确的转换是:

代码语言:javascript
复制
(A and ~B) <:!< (~A and B)
or:
(A and ~B) =:!= (~A and B)

而不是scala代码:

代码语言:javascript
复制
type xor[A, B] = (A with ![B]) =:!= (![A] with B)

def neq[A,B](implicit ev : A xor B) = ...

和测试:

代码语言:javascript
复制
neq[Int, String]          // - ok
neq[String, Int]          // - ok
//neq[String, String]     // - compilation error
//neq[Int, Int]           // - compilation error

毕竟,它可以简化为:

代码语言:javascript
复制
A =:!= B
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24691736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档