3 回答

TA貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超14個(gè)贊
Go接口看起來(lái)就像只是表面上的樣子,就像Haskell中的單參數(shù)類(lèi)型類(lèi)(構(gòu)造函數(shù)類(lèi))一樣。
方法與接口類(lèi)型相關(guān)聯(lián)
對(duì)象(特定類(lèi)型)可能具有該接口的實(shí)現(xiàn)
我不清楚Go是否以任何方式支持通過(guò)接口的有界多態(tài)性,這是類(lèi)型類(lèi)的主要目的。也就是說(shuō),在Haskell中,接口方法可以用于不同的類(lèi)型,
class I a where
put :: a -> IO ()
get :: IO a
instance I Int where
...
instance I Double where
....
所以我的問(wèn)題是Go是否支持類(lèi)型多態(tài)性。如果不是,它們根本就不像類(lèi)型類(lèi)。它們并不是真正可比的。
Haskell的類(lèi)型類(lèi)允許通過(guò)“泛型”(更高種類(lèi)的多態(tài)性)對(duì)代碼進(jìn)行強(qiáng)大的重用-本文為此類(lèi)形式的泛型程序的跨語(yǔ)言支持提供了很好的參考。
通過(guò)類(lèi)型類(lèi)的即席或有界多態(tài)性在此處得到了很好的描述。這是Haskell中類(lèi)型類(lèi)的主要目的,并且沒(méi)有通過(guò)Go接口來(lái)解決,這意味著它們根本不是非常相似。嚴(yán)格來(lái)說(shuō),接口的功能不那么強(qiáng)大-一種零階類(lèi)型類(lèi)。

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超17個(gè)贊
我將在唐·斯圖爾特(Don Stewart)的出色回答中補(bǔ)充說(shuō),Haskell類(lèi)型類(lèi)的令人驚訝的結(jié)果之一是,您可以在編譯時(shí)使用邏輯編程來(lái)生成一個(gè)類(lèi)的任意多個(gè)實(shí)例。(Haskell的類(lèi)型類(lèi)系統(tǒng)實(shí)際上是Prolog的免刪減子集,與Datalog非常相似。)該系統(tǒng)在QuickCheck庫(kù)中得到了極大的利用?;蛘吲e一個(gè)非常簡(jiǎn)單的例子,您可以看到如何定義一個(gè)布爾補(bǔ)數(shù)(not
)版本,該版本可用于任意arity謂詞。我懷疑這種能力是類(lèi)型類(lèi)系統(tǒng)的意外結(jié)果,但是事實(shí)證明它非常強(qiáng)大。

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超6個(gè)贊
在haskell類(lèi)型中,類(lèi)的實(shí)例化是顯式的(即,您必須說(shuō)說(shuō)
instance Foo Bar
Bar是Foo的實(shí)例),而在實(shí)現(xiàn)中,接口是隱式的(即,當(dāng)您定義一個(gè)定義了正確方法的類(lèi)時(shí),它會(huì)自動(dòng)實(shí)現(xiàn)相應(yīng)的接口而無(wú)需不得不說(shuō)implement InterfaceName
)。接口只能描述接口實(shí)例為接收者的方法。在類(lèi)型類(lèi)中,實(shí)例化類(lèi)型可以出現(xiàn)在函數(shù)的任何參數(shù)位置或返回類(lèi)型處(即,可以說(shuō),如果Foo是Bar類(lèi)型的實(shí)例,則必須有一個(gè)名為baz的函數(shù),該函數(shù)需要一個(gè)Int并返回一個(gè)Foo-您不能在接口上這么說(shuō))。
- 3 回答
- 0 關(guān)注
- 338 瀏覽
添加回答
舉報(bào)