Haskell中的class和其它語言(如Rust)中的Trait的區別和聯繫?

Haskell中有類型類(type class)的概念,這個概念和OO中的class又不一樣。

然後又聽說有traits這樣的抽象(比如Rust語言的Trait),希望有人能講解一下這幾者之間的區別和聯繫。

======================

最後我發現Rust中的Trait的確就是Haskell中的type class,見wiki:https://zh.wikipedia.org/wiki/Rust


Haskell 的 class 可以修飾 Kind 非 * 的……東西比如 * -&> *


謝邀。。。

OO里的class在haskell里類似type的概念, 是指一些實例(instance)具有相同的特徵,所以這些實例可以歸為一類,比如1,2,3三個數字都屬於Int這個type。 關羽、張飛都屬於武將的type。

類型類(typeclass)是指一些類型(type)具有相同的特徵,所以這些類型可以歸為一類,所以稱為類型類。 比如Int,Double都可以比較大小,所以他們都符合類型類Ord。

在實現上,類型類有點類似Interface,定義了其必須實現的抽象函數。 同時提供了機制讓程序員可以為已存在的某類型提供類型類的實現,比如你自定義的武將類型,你發現他們也可以比大小,那你就可以給武將提供一個Ord實現。那些適用於Ord的函數你就全可以用在武將上了。

trait,類似三國遊戲里有些人物「特質」, 比如騎將,威風,一個武將(實例)具有某個特質就有了該特質的技能,武將並不需要繼承自騎將、威風等。語法上看上去像繼承,實際上是組合。trait一般是帶有實現的。

trait WeiFeng{
def ha():Unit = println("hahaha!!!")
}

class WuJiang(name: String)

val guanyu = new WuJiang("guanyu") with WeiFeng

guanyu.ha()

雖然scala的trait也可以掛在class上,但我認為那是當做抽象類的語法糖來用而已。

像scala這種面向對象混合函數式編程語言,語法上並沒有支持類型類,但是scala社區普遍用trait+隱式轉換實現類型類的效果,成為了一種模式。 但trait本身跟類型類並沒有什麼關係。

建議你先專心學haskell,把haskell那些概念都吃透,然後再來適配其他語言的概念,不然容易搞暈


推薦閱讀:

面向對象的RAII怎麼處理阻塞型的資源獲取過程?
在面向對象編程時對於類的劃分有哪些心得?
如何通俗易懂地舉例說明「面向對象」和「面向過程」有什麼區別?
arraylist和array在內存分配和調用、編譯上有什麼本質區別?
c++為什麼要讓struct可以定義成員函數?

TAG:面向對象編程 | 函數式編程 | Haskell | 編程理論 | 編程範式 |