在Haskell中创建我自己的图形数据结构

在Haskell中创建我自己的图形数据结构,haskell,graph,Haskell,Graph,我正试图让我的脚湿与哈斯克尔,我发现了一些研讨会,要求创建一个图形数据结构。我随后使用map创建了一个二叉树,感觉简单多了。我给出了以下数据类型 类型图a=[(节点a,边)] 键入Edges=[NodeID] 类型NodeID=Int 数据节点a=节点 {getNodeID::NodeID, getNodeVal::a } 推导(显示,等式) 示例节点如下所示 nodeA=节点0'A' 一个双向连接的示例图是 graphA=[(nodeA[1]),nodeB[0]] 现在,为了执行任何类型

我正试图让我的脚湿与哈斯克尔,我发现了一些研讨会,要求创建一个图形数据结构。我随后使用map创建了一个二叉树,感觉简单多了。我给出了以下数据类型

类型图a=[(节点a,边)]
键入Edges=[NodeID]
类型NodeID=Int
数据节点a=节点
{getNodeID::NodeID,
getNodeVal::a
}
推导(显示,等式)
示例节点如下所示

nodeA=节点0'A'
一个双向连接的示例图是

graphA=[(nodeA[1]),nodeB[0]]
现在,为了执行任何类型的插入或删除操作,我必须首先找出目前的max NodeID是什么。因此,我尝试编写一个maxNodeID,如下所示

maxNodeID::图a->Maybe NodeID
maxNodeID[]=Nothing--基本情况
但是我很难想出这个函数的下一个例子

我对insertNode函数的类型定义如下

insertNode::a->Graph a->Graph a
--这是我对基本情况的想法,但我在0处得到一个解析错误
insertNode v[]=[a,[],其中a=节点{0,v}

如果您能在这方面提供帮助并创建insertNode函数,我将不胜感激,因为这将真正帮助我走上正确的道路。

我将使用Data.List中的function,而不是自己滚动

maxNodeID :: Graph a -> Maybe NodeID
maxNodeID [] = Nothing --base case
maxNodeID xs = Just $ maximumBy (\a b -> compare (getID a) (getID b)) xs
  where getID = getNodeID . fst
对于所需的
insertNode
函数

insertNode v [] = [(a, [])] where a = Node 0 v
-- or --
insertNode v [] = [(a, [])] where a = Node {getNodeID = 0, getNodeVal= v}

编辑以添加:


如果您还不习惯使用类型类,您可以将列表专用的
maximumBy
类型解读为
:(a->a->Ordering)->[a]->a

您能否澄清为什么在{}上使用()呢,即使节点的数据类型是{},它看起来像字典ds(如果用其他语言思考的话)而不是元组。我以前也没见过Just或maximumBy会读到这个。但是使用foldr可以实现吗?对不起,我赶时间。检查Haskell语法以创建记录。(1/2)
Just
是Maybe的另一个构造函数。如果一个分支是
Nothing
,那么另一个分支必须是
Just(…)
。是的,只使用
foldr
(可折叠类的所有函数都可以)编写是可能的,但是为什么已经为您制作了一个非常好的库函数呢?我应该从一开始就澄清,理解foldr和map对我来说更重要,因为它们似乎是构建模块。在开始使用内置libtaty函数之前,我需要练习理解基本原理。因此,本练习将介绍如何创建可以用非函数式语言轻松实现的数据结构。我试着思考同样的问题,但要以一种更实用的方式。