mis*_*tor 18 oop haskell programming-languages functional-programming scala
在关于Haskell类型类的PDF演示文稿中,幻灯片#54有这样一个问题:
公开问题:
在具有泛型和受约束的多态性的语言中,您是否也需要子类型?
我的问题是:
泛型和约束多态如何使子类型不必要?
如果泛型和约束多态不需要子类型,为什么Scala有子类型?
Nor*_*sey 29
泛型和约束多态如何使子类型不必要?
不知道他们这样做. 如果你把幻灯片放在上下文中,我认为说话者试图制作的论点是这样的:
在过去,子类型提供了一种重要的多态性.
同样在过去,在另一个国家,类型抽象和类型参数提供了一种重要的多态性.这种类型在其原生土地中被称为参数多态,但在国外它被称为泛型.
现代泛型承认约束,有时称为"有界多态",它可以实现许多与子类型多态相同的东西.
子类型包含大量的行李 - 特别是,您必须担心协方差和逆变.语言结束时有不舒服的限制,重量级符号,有时甚至是完全违反安全规定(例如,Eiffel).
开放的问题:也许受约束的参数多态解决了足够的相同问题,在幸福的未来,我们可以完全摆脱子类型多态性,并且与它一起讨论何时子类型是协变,逆变和不变的令人讨厌的问题.
luq*_*qui 14
如果这确实是一个悬而未决的问题,那么根据定义,我们不知道#1的答案.设计空间非常不同,对我来说,如何将子类型直接编码为约束多态性并不明显.当参数是多态的时,编码是直接的.例如,具有类型的Haskell函数
foo :: (Num a) => a -> Bool
Run Code Online (Sandbox Code Playgroud)
相当于,说:
Bool foo(Num x)
Run Code Online (Sandbox Code Playgroud)
用OO语言.但是,如何编码还不清楚:
// I will return some Num, but I'm not going to tell you what kind exactly
Num bar(Bool x)
Run Code Online (Sandbox Code Playgroud)
进入受约束的多态性,也不清楚如何编码:
-- I can return any kind of Num, *you* tell *me* what kind
bar :: (Num a) => Bool -> a
Run Code Online (Sandbox Code Playgroud)
进入子类型.
我对#2的最佳猜测是Scala必须与Java交谈,而Java则讨论了子类型.而且因为Scala具有人类已知的所有类型系统功能,因为它认为它必须是为了变冷.:-P
Oleg Kiselyov和RalfLämmel的"Haskell被忽视的对象系统"为Haskell提出了一个库,它使用Haskell的现有特性(包括类型类)实现了一个对象系统.
本文"引言"部分的摘录(强调我的):
由于存在一个基本且悬而未决的问题,本主题的兴趣并不局限于Haskell研究人员和从业人员 - 本文提出的一个问题:
类型有界和子类型多态之间的关系是什么?
在这个研究环境中,我们特定地(并且着重地)将自己局限于现有的Haskell语言(Haskell 98和必要时的公共扩展),即,不会提出新的Haskell扩展.正如我们将证实的那样,这种限制是充分的,因为它允许我们对上述问题提供有意义且重要的答案.
2很容易:因为Java(和JVM字节码)有它.如果我们想从Java调用Scala,我们几乎必须允许扩展Java接口和类; 如果Scala类被转换为JVM类(和接口的特性),那么我们也可以扩展它们.
Scala有同样的理由null
:)
对于1,您还需要具有用于编码的存在类型
Num bar(Bool x)
Run Code Online (Sandbox Code Playgroud)
案件:
bar :: Bool -> exists a. Num a
Run Code Online (Sandbox Code Playgroud)