繁体   English   中英

了解Haskell中的数据结构

[英]understanding data structure in Haskell

我的作业有问题(主题是:“功能数据结构”)。 请理解我不希望任何人解决我的作业。 我只是理解这个结构的问题:

data Heap e t = Heap {
 empty :: t e,
 insert :: e -> t e -> t e,
 findMin :: t e -> Maybe e,
 deleteMin :: t e -> Maybe (t e),
 merge :: t e -> t e -> t e,
 contains :: e -> t e -> Maybe Int
}

在我的理解中,“空”“插入”等是可以应用于“堆”类型数据的函数。 现在我只想了解“Heap”的样子。 所以我输入的内容如下:

  a = Heap 42 42

但我得到的错误我无法真正使用。

也许这是一个愚蠢的问题,我只是无缘无故地停留在这一点上,但此刻它正在杀死我。 感谢任何帮助

如果您真的希望了解该类型,则需要首先了解一些必要条件。

类型和值(和函数)

首先,您需要了解哪些类型和值。 我假设你明白这一点。 例如,你理解"hello"作为一个值与它的类型之间的分离, String和你清楚地理解当我说a = "hello" :: String时它意味着什么:

a :: String
a = "hello"

如果您不理解,那么您需要研究Haskell中的值和类型。 这里有无数的书可以提供帮助,例如我帮助创作的这本书: http//happylearnhaskelltutorial.com

我也会假设您了解功能currying是什么,以及如何使用它们。

多态类型

其次,由于您的示例包含类型变量,您需要了解它们是什么。 也就是说,您需要了解多态类型是什么。 所以,例如, Maybe a或者Either ab ,你需要理解Maybe StringMaybe Int不同之处以及Num a => [a]甚至是什么,比如Num a => [Maybe a]是。

同样,有许多免费或付费书籍可以提供帮助,上面的例子也涵盖了这一点。

代数数据类型

接下来是代数数据类型。 这是Haskell的一个非常酷的功能。 类似Haskell的语言,比如Elm和Idris,以及像Rust这样的其他语言。 它允许您定义自己的数据类型。 这些不仅仅是像其他语言中的Structs这样的东西,是的,它们甚至可以包含函数。

Maybe实际上是代数数据类型的一个例子。 如果您了解这些,您就会知道:

data Direction = North | South | East | West

定义一个名为Direction的数据类型,其值只能是NorthSouthEastWest ,并且您将知道您还可以使用上面的polymorhpic类型变量来参数化您的类型,如下所示:

data Tree a = EmptyNode | Node (Tree a) (Tree a)

它使用两个选项(如上面的Direction 类型 )以及参数化。

除此之外,您还可以在每个值中包含多种类型 这些被称为产品类型 ,Haskell的代数数据类型可以表示为可以包含产品类型的Sum类型的组合。 例如:

type Location = (Float, Float)
data ShapeNode = StringNode Location String | CircleNode Location Float | SquareNode Location Float Float

也就是说,每个值可以是StringNodeCircleNodeSquareNode ,并且在每种情况下,给每个值赋予不同的字段集。 例如,要创建StringNode ,您需要传递构造函数的值,如下所示: StringNode (10.0, 5.3) "A String"

同样,免费提供的书籍将更详细地介绍这些内容,但我们现在正朝着不仅仅是对Haskell的基本理解的方向前进。

最后,为了充分理解您的示例,您需要了解...

记录类型

记录类型与上面的产品类型相同,只是字段是标记的而不是匿名的。 因此,您可以像这样定义形状节点数据类型,而不是:

type Location = (Float, Float)

data ShapeNode
  = StringNode { stringLocation :: Location, stringData :: String }
  | CircleNode { circleLocation :: Location, radius :: Float }
  | SquareNode { squareLocation :: Location, length :: Float, height :: Float }

每个字段都被命名,您不能在数据值中重复相同的名称。

除此之外,您需要的所有内容都是为了理解上面的示例,即实现您的示例包含所有这些内容,以及您在所拥有的数据类型中具有作为记录字段值的函数的事实。

彻底充实你的理解而不是跳过任何步骤是一个好主意,那么你将来可以更容易地遵循这些事情。 :) 祝你好运!

Heap是六个元素的记录。 要创建该类型的值,您必须提供所有六个元素。 假设您有适当的值和函数,您可以创建如下值:

myHeap = Heap myEmpty myInsert myFindMin myDeleteMin myMerge myContains

然而,这似乎不是惯用的Haskell设计。 为什么不定义与数据无关的泛型函数,或者,如果必须将它们捆绑在一起,则为类型类?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM