相当于在Haskell中创建对象

Lan*_*ard 4 oop haskell functional-programming

我试图了解如何使用以下内容:

data Maybe a = Nothing | Just a
data Either a b = Left a | Right b
Run Code Online (Sandbox Code Playgroud)

根据我的理解,这些是参数化的代数数据类型.来自OO背景,我现在想创建这些对象的实例.如果我这样做:

x = Maybe 10
Run Code Online (Sandbox Code Playgroud)

这现在是子类/子代数数据类型,或者想知道该对象被调用了什么.我会认为这是一个类型的某种.如果是这样,那么我想知道如何创建一个实例x.在OO土地我会这样做:

myinstance = new x
Run Code Online (Sandbox Code Playgroud)

这是来到Haskell让我迷路的地方,我不知道在哪里搜索.几个问题要总结:

  1. x上面是什么样的对象.如果Maybe是参数化数据类型,则x是〜某种类型,不确定.
  2. 如何创建一个实例x.
  3. x对于Maybe 的实例是什么,因为我们通过它10.想知道,如果实例值是10并且类型为Int.

Wil*_*ess 5

Maybe 10在Haskell中没有这样的东西.有Maybe Int,这是一种类型.

我们创建了一个价值某种类型的,直接,如

x :: Maybe Int
x = Just 10
Run Code Online (Sandbox Code Playgroud)

要么

y :: Maybe Int
y = Nothing
Run Code Online (Sandbox Code Playgroud)

简单直接.


edit: Maybe是一个类型构造函数.Just并且Nothing数据构造函数.通过写Maybe Int我们"创造"一种类型.没有定义z :: Maybe ; z = ......

这被称为"善良":这种类型Maybe* -> *,而例如Int's是*等等Maybe Int.尝试:kGHCi提示看到这个:

~> :k Int
Int :: *

~> :k Maybe
Maybe :: * -> *

~> :k Maybe Int
Maybe Int :: *
Run Code Online (Sandbox Code Playgroud)

当然,在我们编写时,我们实际上并没有创建一个新类型"Maybe Int,只是它Maybe本身并不是一种类型的东西("事物"类型有类型*).

对于我们可能使用的任何Maybe类型Maybe a,定义是什么创建类型a.这称为参数多态.

所以在Haskell中,我们没有对象(在OOP意义上).我们有价值观和类型.

  • @LancePollard 我同意你的观点,没有按“也许”类型分类的表达式,但不是因为你说的原因。`Maybe` 确实是一个(类型)构造函数。 (2认同)