2010-06-05 65 views

回答

21

看起來像only in superficial ways是像Haskell中的單參數類型類(構造函數類)的Go接口。

  • 方法是與接口類型相關聯
  • 對象(特定類型的)可以具有接口的實現

目前還不清楚我走以任何方式是否支持經由接口,有界多態性這是類型類的主要目的。也就是說,在Haskell中,接口方法可能會用到不同的類型,所以我的問題是Go是否支持類型多態性。如果不是,他們根本就不喜歡輸入類。而且它們並沒有真正的可比性。

Haskell的類型類允許通過「泛型」強有力地重用代碼 - 更高的主導多態性 - 對於cross-language support for such forms of generic program is this paper很好的參考。

通過類型類別的臨時或有界多態性是well described here。這是Haskell類型類的主要目的,也是一個沒有通過Go接口解決的問題,這意味着它們根本不是非常相似。接口嚴格不那麼強大 - 一種零階類型。

+4

事實上,兩者之間唯一的關係似乎是在兩種情況下,「方法」都獨立於「類」生活。就是這樣。 – 2010-06-05 21:20:59

+2

Go的接口支持「有限多態性」,如維基百科文章嚴格定義的那樣,只需簡單地在函數的簽名中指定所需的接口。例如,如果我寫「func foo(a,b IBar)」,那麼編譯器確保我只能通過支持IBar的結構。然而,Haskell的typeclasses支持非結構類型,甚至是複合綁定(例如,func foo(a,b(IBar && IBaz))在Go中是非法的,但是(IBar a,IBaz a)=> foo :: a - > b - > ...是完全合法的)。您必須在Go中創建一個複合界面才能執行類似的操作(vis。io.ReadCloser)。 – 2015-02-15 00:18:51

6
  1. 在Haskell類型類的實例是明確的(即你必須說instance Foo Bar的酒吧是美孚的實例),而在實現一個接口走的是隱含的(即當你定義一個類定義了正確的方法,它會自動實現相應的界面,而不必像implement InterfaceName那樣說)。
  2. 接口只能描述接口實例是接收者的方法。在類型類中,實例化類型可以出現在任何參數位置或函數的返回類型(也就是說,如果Foo是Bar類型的實例,則必須有一個名爲baz的函數,它接受一個I​​nt並返回一個Foo - 你不能用接口來說)。
+4

多態性的缺乏嚴重限制了Go語言與類型類相關的程度。我會說在實例方法中沒有多態性,除了表面上外,它們並不真正相關。 – 2010-06-05 21:11:47

+0

人們詢問它顯示他們顯然是相關的。我會說Go接口是Haskell類型類提供的一個嚴格子集。例如,你可以在Haskell中做的所有事情都可以在Haskell中進行(平凡,均勻),但是反過來是不正確的。 – 2015-02-15 00:21:57

5

非常膚淺的相似之處,Go的界面更像是OCaml中的結構化子分型。

6

我會添加到唐·斯圖爾特的出色答卷是Haskell的類型類的奇怪consquences之一是,你可以用邏輯程序在編譯時產生一類的任意多個實例。 (Haskell的類型級系統包含Prolog的有效切割子集,與Datalog非常相似)。該系統在QuickCheck庫中受到了極大的影響。或者,舉一個非常簡單的例子,您可以看到如何定義version of Boolean complement (not) that works on predicates of arbitrary arity。我懷疑這種能力是類型系統的意外後果,但它已被證明非常強大。

Go沒有喜歡它。

3

C++ Concepts(即沒能成C++ 0X)是象Haskell類型的類。還有一些「公理」,根本不存在於Haskell中。他們讓你像monad法律那樣正式化。