在Java中,我们可以从类中创建对象/实例。 在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 Obs:我不是在问fmap是如何工作的,我问的是实例解除在Haskell中意味着什么。
我的问题是: 实例在haskell中意味着什么? 在java中我们可以从类中创建实例,但在haskell中,似乎实例是类型(如ShirtSize),您可以在其上应用类型类函数(例如,来自MyEq的(==)函数)。我对吗?还有什么是Haskell中的实例与Java中的实例/对象相比?
答案 0 :(得分:14)
在Java中,类系统是一种对类似对象进行分组的方法。类的实例是属于该类的单个对象。
在Haskell中,类系统(粗略地说)是一种将类似类型分组的方法。 (这就是我们称之为"类型类")的原因。类的实例是属于该类的单个类型。 (也就是说,直到你开始考虑多参数类型)。
顺便提一下,Haskell(单参数)类有点类似于Java接口,并且通过扩展,类似于Java类。或许Haskell实例类似于Java类。最好将此视为巧合。接近保持其数学起源的术语。一个类只是一堆属于一起的东西,一个实例就是其中之一。
答案 1 :(得分:7)
如果您对类型类的解释和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?