【问题标题】:Creating my own Graph Data Structure in Haskell在 Haskell 中创建我自己的图形数据结构
【发布时间】:2020-11-16 18:47:24
【问题描述】:

我正在尝试使用 Haskell,并且我找到了一些要求创建图形数据结构的研讨会。我跟着并使用感觉更简单的地图创建了一个二叉树。我给出了以下数据类型

type Graph a = [(Node a, Edges)]

type Edges = [NodeID]

type NodeID = Int

data Node a = Node
  { getNodeID :: NodeID,
    getNodeVal :: a
  }
  deriving (Show, Eq)

示例节点如下

nodeA = Node 0 'A'

双向连接的示例图将是

graphA = [(nodeA, [1]), nodeB, [0]]

现在,为了进行任何类型的插入或删除操作,我首先必须找出此时的最大 NodeID 是多少。所以我想写一个maxNodeID如下

maxNodeID :: Graph a -> Maybe NodeID
maxNodeID [] = Nothing --base case

但是我很难为这个函数想出下一个案例。

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

insertNode :: a -> Graph a -> Graph a
-- This is my idea for a base case but I get a parse error at 0  
insertNode v [] = [a, []] where a = Node {0, v}  

对此和创建 insertNode 函数的任何帮助将不胜感激,因为它确实可以帮助我走上正确的道路。

【问题讨论】:

    标签: haskell graph


    【解决方案1】:

    我不会自己滚动,而是使用 Data.List 中的 maximumBy :: Foldable t => (a -> a -> Ordering) -> t a -> a 函数。

    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

    【讨论】:

    • 您能否解释一下为什么使用 () 而不是 {},即使 Node 的数据类型是 {},它看起来像字典 ds(如果用其他语言考虑的话)而不是元组。此外,我还没有看到 Just 或 maximumBy 之前会读到这一点。但这可以使用 foldr 实现吗?
    • 对不起,我赶时间了。检查用于创建记录的 Haskell 语法。 (1 / 2)
    • Just 是 Maybe 的另一个构造函数。如果一个分支是Nothing,那么另一个分支必须是Just (...)。是的,可以只使用foldr 编写(Foldable 类的所有函数都可以),但是为什么已经为您制作了一个非常好的库函数呢?
    • 我应该从一开始就澄清,理解 foldr 和 map 对我来说更重要,因为它们似乎是构建块。在开始使用内置的 libtaty 函数之前,我需要练习理解基础知识。因此,这个练习创建了我可以用非函数式语言轻松实现的数据结构。我正在尝试以更实用的方式思考同样的问题。
    猜你喜欢
    • 2011-12-14
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 2021-01-25
    相关资源
    最近更新 更多