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让我迷路的地方,我不知道在哪里搜索.几个问题要总结:
x上面是什么样的对象.如果Maybe是参数化数据类型,则x是〜某种类型,不确定.x.x对于Maybe 的实例是什么,因为我们通过它10.想知道,如果实例值是10并且类型为Int.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意义上).我们有价值观和类型.