2017-07-03 105 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?