8得票1回答
Haskell中的类型类依赖和面向对象编程中的子类型有什么区别?

我们经常使用类型类依赖来模拟子类型关系。 例如: 当我们想要在面向对象编程中表达Animal、Reptile和Aves之间的子类型关系时: abstract class Animal { abstract Animal move(); abstract Animal hu...

17得票5回答
为什么对于forall a. a这种类型,它不被认为是Int的子类型,但我可以在需要Int类型的任何地方使用一个类型为forall a. a的表达式?

考虑以下一对函数定义,它们通过类型检查器:a :: forall a. a a = undefined b :: Int b = a 也就是说,类型为forall a. a的表达式可以被用在期望类型为Int的地方。这对我来说看起来很像子类型化,但据称Haskell的类型系统缺乏子类型化。这些...

9得票1回答
Scala中的UpperBound和LowerBound概念

以下是我正在尝试运行的代码: class Student { def printDetails = println("I am a student") def printSomeOtherDetails = println("I love Studying") } class Co...

7得票1回答
TypeScript:为什么数字可以分配给类型为Object的引用?

为什么TypeScript合法? var x: number = 5 var y: Object = x 显然,数字并不是一个对象。你可能会怀疑x被隐式转换(自动装箱)为对象,但事实并非如此: if (!(y instanceof Object)) { console.log(t...

16得票1回答
关于Java和Scala中的泛型

我对通用子类型感到困惑。 在Java中,如果类型A是类型B的子类型,那么泛型类型C<A>和C<B>是不变的。例如,ArrayList<Base>不是ArrayList<Derived>的子类型。 然而,在Scala中,如果类型A是类型B的子类...

15得票1回答
Haskell的类型系统是否遵守Liskov替换原则?

我来自Java背景,现在正在尝试理解Haskell的类型系统。在Java世界中,里氏替换原则是基本规则之一,我想知道这是否也适用于Haskell(请原谅我对Haskell的了解有限,希望我的问题有意义)。 例如,在Java中,通用的基类Object定义了方法boolean equals(Ob...

12得票1回答
Kotlin中的@uncheckedVariance是什么?

在他的演讲《编译器就是数据库》中,Martin Odersky提出了一个有趣的变量角落情况: class Tree[-T] { def tpe: T @uncheckedVariance def withType(t: Type): Tree[Type] } T的定义是逆变的,因...

32得票1回答
在Rust中,生命周期的子类型关系很难理解。

我觉得自己很傻,因为我已经多次浏览了Rust文档中的标记部分以及关于子类型和变异性的维基百科文章,但对生命周期子类型关系的理解并没有提高。 我想我只是习惯了“典型的面向对象编程风格”中的子类型关系,例如“Cat <: Animal”表示“Cat是Animal的一个子类型”,其中“S是T...

16得票1回答
从非协变类型类的实例创建协变类型类的实例

假设我有一个简单的类型类(type class),其实例会给我某种类型(type)的值:trait GiveMeJustA[X] { def apply(): X } 我有一些实例:case class Foo(s: String) case class Bar(i: Int) implic...

15得票2回答
为什么OCaml不支持记录子类型?

阅读《类型和编程语言》,我对使用闭包和记录子类型实现对象印象深刻(第18章)。有没有特殊的原因,导致OCaml不支持记录子类型(虽然我知道对象支持)?事实上,我找不到任何支持此功能的语言。