2017-07-03 101 views
10

在Java中,我們可以從類中創建對象/實例。 在Haskell,我們可以從類型的類的實例,例如:Haskell中的實例是什麼意思?

data ShirtSize = S | M | L  -- Here ShirtSize is a enum data-type 

class MyEq a where 
    (==) :: a -> a -> Bool 
instance MyEq ShirtSize where -- Here ShirtSize is an instance of the MyEq type-class 
    S == S = True 
    M == M = True 
    L == L = True 
    _ == _ = False 

這是不一樣的問題:confused about function as instance of functor in haskell觀測值:我不問如何FMAP的作品,我問什麼情況下decleration在Haskell指。

我的問題是: 實例在haskell中的含義是什麼? 在java中,我們可以從類中創建實例,但在haskell中,實例看起來像是類型(如ShirtSize),您可以在其上應用類型函數(例如,MyEq中的(==)函數)。我對嗎?以及Haskell中的實例與Java中的實例/對象相比是什麼?

+12

它更像Java中的「implements Interface」。 – Bergi

+3

我認爲你用「實例是類型(如ShirtSize),你可以應用類型函數(例如MyEq中的(==)函數)」。那之後幾乎沒有任何空間可供回答。當我們迴應時,我們是否可以評論進一步的混淆? –

+0

閱讀從http://learnyouahaskell.com/making-ty-own-types-and-typeclasses Tyleslasses 102節我給出了一個很好的描述 –

回答

12

在Java中,該類系統是一種將類似的對象。類的實例是屬於該類的單個對象。

在Haskell中,類系統(粗略地說)是將類似的類型分組的方法。 (這就是我們稱之爲「類型類」的原因)。一個類的實例是屬於該類的個人類型。 (也就是說,直到你開始考慮多參數類型類)。順便提一下,Haskell(monoparametric)類有點類似於Java接口,並且擴展爲Java類。或者一個Haskell實例可能類似於Java類。最好把這看成是巧合。接近這個詞,記住它的數學淵源。一堂課只是一羣屬於一起的東西,一個實例就是這些東西之一。

5

如果您有興趣解釋類型類和與Java接口的區別,您應該閱讀this post by <❤>。它也解釋了實例。

至於我,我看instance數據類型和接口之間的連接data包含一些信息,class包含方法。 data約爲數據(對於重言式抱歉)和class約爲行爲。當你看數據類型時,你看不到你可以用它做什麼,而是看看它存儲了什麼。當你看到class時,你會發現什麼類型應該能夠做到,你不關心它在內部存儲什麼。在真正的編程中,您實際上關心實現的細節以及如何使用特定數據實現方法。因此instance只顯示了一些數據和一些行爲之間的關係 - 如何使用給定的數據實現此行爲。

如果你在類型類的模式更感興趣,然後閱讀這篇博客:http://www.haskellforall.com/2012/05/scrap-your-type-classes.html

你可以看一下作爲一個值的實例!如果你第一次面對這樣的定義,它可能會打擊你的思想。

在某些依賴型語言中instances確實是可以傳遞給其他函數的值。看看這個問題:

In Idris, is "Eq a" a type, and can I supply a value for it?