Haskell的TypeClass和Go的接口有什麼相似之處和不同之處?這兩種方法的相對優點和缺點是什麼?Haskell的TypeClass和Go的接口
回答
看起來像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接口解決的問題,這意味着它們根本不是非常相似。接口嚴格不那麼強大 - 一種零階類型。
- 在Haskell類型類的實例是明確的(即你必須說
instance Foo Bar
的酒吧是美孚的實例),而在實現一個接口走的是隱含的(即當你定義一個類定義了正確的方法,它會自動實現相應的界面,而不必像implement InterfaceName
那樣說)。 - 接口只能描述接口實例是接收者的方法。在類型類中,實例化類型可以出現在任何參數位置或函數的返回類型(也就是說,如果Foo是Bar類型的實例,則必須有一個名爲baz的函數,它接受一個Int並返回一個Foo - 你不能用接口來說)。
多態性的缺乏嚴重限制了Go語言與類型類相關的程度。我會說在實例方法中沒有多態性,除了表面上外,它們並不真正相關。 – 2010-06-05 21:11:47
人們詢問它顯示他們顯然是相關的。我會說Go接口是Haskell類型類提供的一個嚴格子集。例如,你可以在Haskell中做的所有事情都可以在Haskell中進行(平凡,均勻),但是反過來是不正確的。 – 2015-02-15 00:21:57
非常膚淺的相似之處,Go的界面更像是OCaml中的結構化子分型。
我會添加到唐·斯圖爾特的出色答卷是Haskell的類型類的奇怪consquences之一是,你可以用邏輯程序在編譯時產生一類的任意多個實例。 (Haskell的類型級系統包含Prolog的有效切割子集,與Datalog非常相似)。該系統在QuickCheck庫中受到了極大的影響。或者,舉一個非常簡單的例子,您可以看到如何定義version of Boolean complement (not
) that works on predicates of arbitrary arity。我懷疑這種能力是類型系統的意外後果,但它已被證明非常強大。
Go沒有喜歡它。
C++ Concepts(即沒能成C++ 0X)是象Haskell類型的類。還有一些「公理」,根本不存在於Haskell中。他們讓你像monad法律那樣正式化。
- 1. Haskell中的Typeclass
- 2. Haskell typeclass
- 3. Haskell Typeclass檢查
- 4. Haskell - 添加typeclass?
- 5. Haskell中的Typeclass轉換
- 6. Typeclass和斯卡拉集合接口
- 7. Haskell Typeclass類型限制和扣除
- 8. Haskell typeclass對組的定義的限制
- 9. 與Haskell typeclass中的類型匹配
- 10. Haskell無法創建TypeClass的實例
- 11. 列出Go中接口的接口
- 12. Typeclass是Haskell中另一個和默認實現的超集
- 13. Go中的接口層次
- 14. LIRC與Haskell的接口
- 15. 在Go中使用接口
- 16. 在Go中擴展接口
- 17. Go接口/容器使用
- 18. 多態性GO接口
- 19. Go堆。作爲結構的接口
- 20. Typeclass Coproduct的派生?
- 21. Typeclass subclassing
- 22. 列出Haskell的網絡接口
- 23. 什麼是接口的haskell等價物?
- 24. Go結構作爲方法接收器有和沒有接口
- 25. GO使用接口作爲字段
- 26. 如何監視網絡接口(go-lang)
- 27. Google Go數據存儲接口
- 28. Typeclass優先
- 29. GO短信和android.provider.Telephony.SMS_RECEIVED接收
- 30. Go中的接口的自定義JSON序列化和反序列化
事實上,兩者之間唯一的關係似乎是在兩種情況下,「方法」都獨立於「類」生活。就是這樣。 – 2010-06-05 21:20:59
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