Jim*_*Jim 23 oop haskell programming-languages functional-programming scala
如果有的话,OOP子类型优于类型组有什么优势?换句话说,现在我们有类型类,有没有理由继续使用OOP子类型?
PS:我是Scala程序员.
Dav*_*ith 14
目前,Scala类型类的语法开销比通过特征继承的子类型大得多,因为潜在的运行时开销也是如此.想象一下,您需要有50种不同类型的事件符合支持事件处理引擎的接口.写起来容易得多
class MyEvent extends Event{
  val name = "foo"
}
比
class MyEvent{
   val name = "foo"
}
object MyEvent2Event{
   implicit def convert(myEvent:MyEvent) = new Event{ val name = myEvent.name}
}
第二种形式允许在事后多态性,命名自由和一般错误组合方面具有更大的灵活性,但输入那五十种转换方法然后在需要类型类时进行适当的导入将会变得更好一个正确的痛苦.如果你不需要灵活性,很难看到收益.另外,在第二个关键字中唠叨"新"关键字,这将产生无穷无尽的"这是对垃圾收集器的过度压力"的论点.
对于引入可变状态的mixin继承,情况更糟.考虑以下特征,取自生产代码:
trait Locking{
   private val lock = new ReentrantReadWriteLock()
   def withReadLock[T](body: => T):T={
      try{
         lock.readLock.lock()
         body
      }finally{
         lock.readLock.unlock()
      }
   }
   // same for withWriteLock
}
由于存在"锁定"val,因此非常方便地使用mixin继承,并且不能真正使用Scala类型类.它应该去哪里?如果将它放在改编的类中,则会丢失该特征的大部分封装值.如果将它放在适配器代码中,则锁不再保护任何东西,因为每次调整时都会锁定不同的锁定对象.
就个人而言,我发现OOP在处理得好的约束下更容易处理.换句话说:在你实际上不需要类型类的情况下,我发现对象更容易理解.
但是,这可能只是对象的典型类型类嵌入所具有的语法开销的工件.如果Haskell对于一些常见类型的类型模式具有语法糖,那么这种差异可能会消失.
我发现更有趣的是,Haskell社区显示类型类比对象更强大,因为在类型类中存在对象的简单嵌入,但类型类可以做对象不能做的事情.然而,Scala社区显示对象至少与类型类1一样强大,因为在对象中存在类型的类型嵌入.
这似乎表明两者之间的关系比通常认为的更亲密.
1请参阅Bruno CdS Oliveira,Adriaan Moors和Martin Odersky的类型类作为对象和含义,以及关于Lambda the Ultimate的论文的讨论,特别是Paul Snively的这个很好的总结(重点补充):
Martin Odersky和团队关于如何使用统一的OO和FP语言进行类型分类的设计决策继续带来令人着迷的成果.Implicits看起来越来越不像"穷人的类型",并且越来越像是对类型类的改进,在我看来快速阅读本文.
在一种不是纯粹功能的语言中,子类型可以让你有相同用法的不同副作用; 使用类型类并不总是很容易实现.(当然,你可以实现它;它对我来说似乎更尴尬.)
此外,子类型可以更有效 - 它是一种缓存"X是Y"的信息的方法,而不需要重复转换(或编译器英雄来缓存该信息)X到Y.对于非常深层次的层次结构,这可能是一个问题.