【问题标题】:Get parent node of the node in a rose tree获取玫瑰树中节点的父节点
【发布时间】:2021-06-17 19:19:52
【问题描述】:

我正在尝试使用以下代码获取玫瑰树中节点的父节点:

{-# LANGUAGE DeriveAnyClass    #-}
{-# LANGUAGE DeriveFunctor     #-}
{-# LANGUAGE DeriveGeneric     #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}

module Main where

import GHC.Generics (Generic)

data RoseTree a = RoseTree { value :: a, children :: [RoseTree a]}
                   deriving (Show, Generic, Functor)

type Timestamp = Integer

type Tree = RoseTree Timestamp 

getParentNode :: Timestamp -> Tree -> Maybe Timestamp 
getParentNode node tree@(RoseTree _ []) = Nothing
getParentNode node tree@(RoseTree rootNode (x:xs)) =
  if node == value x then Just rootNode else case getParentNode node x of 
    Nothing -> case getParentNodeForList node (children x) of 
      Nothing -> getParentNodeForList node xs
      Just parent -> Just parent
    Just parent -> Just parent 

getParentNodeForList :: Timestamp -> [Tree]-> Maybe Timestamp
getParentNodeForList node [] = Nothing
getParentNodeForList node (x:xs) = case getParentNode node x of 
  Nothing -> case getParentNodeForList node (children x) of 
    Nothing -> getParentNodeForList node xs
    Just parent -> Just parent
  Just parent -> Just parent 


main :: IO ()
main = do
  let tree = RoseTree 1623839394 [RoseTree 1623839395 [], RoseTree 1623839396 [], RoseTree 1623839397 []]
  putStrLn $ show $ getParentNode 1623839397 tree

在这种情况下,输出为Nothing。我不懂为什么。我涵盖了getParentNodegetParentNodeForList 中所有可能的遍历情况(至少看起来是这样,它显然不起作用)。

感谢任何帮助。

【问题讨论】:

  • 你能解释一下getParentNodegetParentNodeList 应该做什么吗?我想我可以从名字上猜到getParentNode,但是getParentNodeList有点模棱两可,我不知道你为什么会在getParentNode函数的定义中使用它。
  • getParentNodeList 搜索 node 在玫瑰树儿童中的出现

标签: haskell


【解决方案1】:

我认为问题在于getParentNode 应该在getParentNode node (RoseTree rootNode xs) 上递归,所以整个函数会变成:

getParentNode :: Timestamp -> Tree -> Maybe Timestamp 
getParentNode node tree@(RoseTree _ []) = Nothing
getParentNode node tree@(RoseTree rootNode (x:xs)) =
  if node == value x then Just rootNode else case getParentNode node x of 
    Nothing -> case getParentNodeForList node (children x) of 
      Nothing -> getParentNode node (RoseTree rootNode xs)
      Just parent -> Just parent
    Just parent -> Just parent 

就我个人而言,我会使用asum来写得更简洁:

getParentNode node (RoseTree x xs)
  | node `elem` map value xs = pure x
  | otherwise = asum (map (getParentNode node) xs)

【讨论】:

    猜你喜欢
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多