我的家庭作业存在问题(主题是:"功能数据结构")。 请理解我不希望任何人解决我的作业。 我只是理解这个结构的问题:
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"类型数据的函数。 现在我只想了解那个" Heap"是什么样子。 所以我输入的内容如下:
a = Heap 42 42
但我得到的错误我无法真正合作。
也许这是一个愚蠢的问题,我只是无缘无故地坚持到这一点,但此刻正在杀死我。 感谢任何帮助
答案 0 :(得分:4)
如果你真的希望了解这种类型,你需要先了解一些必要条件。
首先,您需要了解哪些类型和值。我假设你明白这一点。例如,您理解"hello"
作为值与其类型String
之间的分离,并且您清楚地理解当我说a = "hello" :: String
时它意味着什么并且:
a :: String
a = "hello"
如果你不明白,那么你需要研究Haskell中的值和类型。这里有无数的书可以提供帮助,例如我帮助创作的这本书:http://happylearnhaskelltutorial.com
我也会假设您了解函数和 currying 是什么,以及如何使用它们。
其次,由于您的示例包含类型变量,您需要了解它们是什么。也就是说,您需要了解多态类型是什么。例如,Maybe a
或Either a b
,您需要了解Maybe String
与Maybe Int
的不同之处以及Num a => [a]
甚至是什么之类的内容Num a => [Maybe a]
是什么。
同样,有许多免费或付费的书可以提供帮助,上面的例子也涵盖了这一点。
接下来是代数数据类型。这是Haskell的一个非常酷的功能。类似Haskell的语言,比如Elm和Idris,以及像Rust这样的其他语言。它可以让您定义自己的数据类型。这些不仅仅是像其他语言中的Structs这样的东西,是的,它们甚至可以包含函数。
Maybe
实际上是代数数据类型的一个例子。如果您了解这些,您就会知道:
data Direction = North | South | East | West
定义了一个名为Direction
的数据类型,其值只能是North
,South
,East
或West
中的一个,您就会知道你也可以使用上面的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
也就是说,每个值可以是StringNode
,CircleNode
或SquareNode
中的一个,并且在每种情况下,每个值都有一组不同的字段。例如,要创建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 }
每个字段都已命名,您不能在数据值中重复相同的名称。
除此之外,您需要的所有内容都是为了理解上面的示例,即实现您的示例包含所有这些内容,以及您在所拥有的数据类型中将函数作为记录字段值这一事实。
彻底充实你的理解而不是跳过任何步骤是一个好主意,那么你将来可以更容易地遵循这些事情。 :)祝你好运!
答案 1 :(得分:1)
Heap
是一个包含六个元素的记录。要创建该类型的值,您必须提供所有六个元素。假设您有适当的值和函数,您可以创建如下值:
myHeap = Heap myEmpty myInsert myFindMin myDeleteMin myMerge myContains
然而,这并不像惯用的Haskell设计。为什么不定义与数据无关的泛型函数,或者,如果它们必须捆绑在一起,则为类型类?