斯卡拉特质和C++概念之间的差异
斯卡拉特质Haskell类型类和C++ 0x概念有什么区别?斯卡拉特质和C++概念之间的差异
就像下面这个例子里观察者声明一个抽象成员receiveUpdate 观察者实际上是一个“匿名”类型或结构类型。
package observer
trait Subject {
type Observer = { def receiveUpdate(subject: Any) }
private var observers = List[Observer]()
def addObserver(observer:Observer) = observers ::= observer
def notifyObservers = observers foreach (_.receiveUpdate(this))
}
- 概念不是来的C++ 0x,他们已经在规范草案的最后几个版本中删除。
- 最初设计用于参数多态性的有限量化的类型类(泛型约束,“forall x使得x是...”)以及一种机制为少量完全类型推断的语言提供即席多态性特别的方式。
- 概念也用于参数多态性的有界量化并提供概念重载,这弥补了C++中模板函数缺少部分专业化。它们最初设计用于处理C++中的模板错误消息问题。
- 特征是不使用多重继承的混合行为机制。
所以他们只有两个有共同的东西,但不是太多,那就是Concepts和Type-classes。本文中已经有两个比较:A comparison of C++ concepts and Haskell type classes
我不认为#3是一个大问题,因为每个人只是使用静态的朋友类实现,并获得相同的效果。另外,仅仅允许部分规范的功能,而不是贯穿整个概念的事情就更容易了。 – Puppy 2010-06-23 22:05:42
@DeadMG:什么问题?得到什么样的效果?您可以使用标签类型调度技术来模拟模板函数的部分特殊化,这正是目前迭代器概念和“专用”算法的通用算法所完成的工作,具体取决于迭代器/容器类型特征。无论如何,我从来没有试图进入任何有关问题的辩论,这只是与主题不同。 – 2010-06-23 22:16:05
我在斯卡拉发现了haskell Eq和Ord Type类的比较 http://blog.tmorris.net/the-power-of-type-classes-我不明白哪一个更强大,为什么 – skyde 2010-06-24 17:29:33