gpt4 book ai didi

haskell - 了解Haskell中的数据结构

转载 作者:行者123 更新时间:2023-12-02 17:09:11 24 4
gpt4 key购买 nike

我在做作业时遇到了问题(主题是:“功能数据结构”)。
请了解,我不希望任何人解决我的作业。
我只是对理解此结构有问题:

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
}


在我的理解中,“空”,“插入”等是可以应用于“堆”类型数据的函数。
现在,我只想了解“堆”的外观。
所以我在输入类似:

  a = Heap 42 42


但是我遇到了我无法真正解决的错误。

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

最佳答案

如果您确实希望了解该类型,则需要首先了解一些要求。
类型和值(和功能)
首先,您需要了解什么是类型和值。我假设你理解这一点。例如,您了解"hello"作为值和其类型String之间的分隔,并且清楚地理解了当我说a = "hello" :: String时的含义和:

a :: String
a = "hello"

如果您不了解,则需要研究Haskell中的值和类型。这里有许多书籍可以提供帮助,例如我帮助撰写的这本书: http://happylearnhaskelltutorial.com
我还将假设您了解什么是函数和currying,以及如何同时使用它们。
多态类型
其次,由于您的示例包含类型变量,因此您需要了解它们的含义。也就是说,您需要了解什么是多型性类型。因此,例如 Maybe aEither a b,您将需要了解 Maybe StringMaybe Int的不同之处,以及 Num a => [a]甚至是 Num a => [Maybe a]之类的东西。
同样,有许多免费或付费书籍可以提供帮助,上面的示例也涵盖了这一点。
代数数据类型
接下来是代数数据类型。这是Haskell拥有的非常酷的功能。 Elm和Idris等类似Haskell的语言以及Rust等其他语言也有它。它使您可以定义自己的数据类型。这些不仅是其他语言中的Structs之类的东西,是的,它们甚至可以包含函数。
Maybe实际上是代数数据类型的示例。如果您了解这些内容,就会知道:
data Direction = North | South | East | West

定义一个名为 Direction的数据类型,其值只能是 NorthSouthEastWest之一,并且您将知道也可以使用上面的多态类型变量来参数化类型像这样:
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 }

每个字段都有名称,您不能在数据值中重复相同的名称。
除此以外,您还需要了解上面的示例,这是为了使您的示例将所有这些内容结合在一起,以及您具有的功能作为您所拥有的数据类型中的记录字段值的事实。
充分充实您的理解力而不跳过任何步骤是一个好主意,这样以后您就可以更轻松地进行这些操作。 :) 祝你好运!

关于haskell - 了解Haskell中的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44746253/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com