【问题标题】:What does instance mean in Haskell?Haskell 中的实例是什么意思?
【发布时间】:2017-12-06 18:53:35
【问题描述】:

在面向对象的语言(例如 Java 和 Python)中,我们可以从类中创建对象/实例。 在 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

我的问题是: 实例在haskell中是什么意思? 在 java 中,我们可以从类中创建实例,但在 haskell 中,实例似乎是类型(如 ShirtSize),您可以在其上应用类型类函数(例如 MyEq 中的 (==) 函数)。我对吗?以及与 Java 中的实例/对象相比,Haskell 中的实例是什么?

【问题讨论】:

  • 它更像是 Java 中的“implements Interface”。
  • 我认为你用“实例是类型(如 ShirtSize),你可以在其上应用类型类函数(例如来自 MyEq 的 (==) 函数)。”。在那之后几乎没有留给答案的余地。当我们回复时,是否还有更多的困惑可以发表评论?
  • 阅读 learnyouahaskell.com/making-our-own-types-and-typeclasses 的 Typeclasses 102 部分我认为给出了非常好的描述
  • 我觉得“instance”并不是说“可以实例化”,而是“这个类型是这个类型类的一个实例,所以可以使用它的方法”。

标签: haskell functional-programming typeclass


【解决方案1】:

在 Java 中,类系统是一种对相似对象进行分组的方法。类的实例是属于该类的单个对象。

在 Haskell 中,类系统(粗略地说)是一种对相似的类型进行分组的方法。 (这就是我们称它们为“类型类”的原因)。一个类的实例是属于该类的一个单独的type。 (也就是说,直到您开始考虑多参数类型类)。

顺便说一句,Haskell(单参数)类在某种程度上类似于 Java 接口,并且通过扩展,类似于 Java 类。或者,Haskell 实例可能类似于 Java 类。最好将其视为巧合。接近这个术语,记住它的数学起源。一个类就是一堆属于一起的东西,一个实例就是其中之一。

【讨论】:

    【解决方案2】:

    如果您对类型类的解释以及与 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?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-31
      • 2015-09-14
      • 2016-09-14
      • 1970-01-01
      • 2013-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多