实例在Haskell中意味着什么?

时间:2017-07-03 13:20:20

标签: haskell functional-programming typeclass

在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中的实例/对象相比?

2 个答案:

答案 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?