初步说明:
经过几次修改后,这个问题才得以解决,因为我缺乏适当的术语来准确说明我要寻找的内容。然后,Sam Tobin-Hochstadt发表了一条评论,这使我确切地知道了这是什么:支持函数返回值的交集类型的编程语言。
既然问题已经重新提出,我已经决定通过(希望)更精确的方式重写它来改进它。因此,下面的某些答案和注释可能不再有意义,因为它们是指先前的编辑。(在这种情况下,请参阅问题的编辑历史记录。)
是否有支持功能返回值的交集类型的流行的静态和强类型编程语言(例如Haskell,通用Java,C#,F#等)?如果是这样,那又如何?
(老实说,我真的很希望看到有人演示一种如何使用主流语言(例如C#或Java)来表示交集类型的方法。)
我将使用一些类似于C#的伪代码给出一个简短的示例,说明交集类型的外观:
interface IX { … }
interface IY { … }
interface IB { … }
class A : IX, IY { … }
class B : IX, IY, IB { … }
T fn() where T : IX, IY
{
return … ? new A()
: new B();
}
也就是说,该函数fn
返回某种类型的实例,T
调用者仅知道其实现了接口IX
和的类型IY
。(也就是说,与泛型不同,调用者没有选择T
函数的具体类型,而是函数。T
实际上,这不是通用类型,而是存在类型。)
PS:我知道可以简单地定义a interface IXY : IX, IY
并将返回类型更改fn
为IXY
。然而,这是不是真的同样的事情,因为通常你可以额外的接口上不螺栓IXY
,以先前定义的类型A
,其仅实现IX
和IY
分开。
脚注:有关路口类型的一些资源:
维基百科上有关“类型系统”的文章有一个关于交叉点类型的小节。
Benjamin C. Pierce(1991)的报告,“使用交叉点类型,并集类型和多态性进行编程”
David P. Cunningham(2005),“实践中的交集类型”,其中包含有关Forsythe语言的案例研究,该文章在Wikipedia文章中提到。
一个堆栈溢出问题,“联合类型和交叉点类型”,得到了几个很好的答案,其中一个给出了类似于上面我的交叉点类型的伪代码示例。
T
接口的I
所有方法但未声明该接口时,哪种语言允许将类型视为接口”。
T
定义一个类型,即使它只是在函数声明为“某种类型的扩展/工具中定义IX
和IY
”。实际返回值是该返回值(A
或B
分别)的特殊情况,在这里并没有什么特别的事实,您也可以使用Object
代替代替来实现T
。