簡體   English   中英

獲取玫瑰樹中節點的父節點

[英]Get parent node of the node in a rose tree

我正在嘗試使用以下代碼獲取玫瑰樹中節點的父節點:

{-# 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中涵蓋了所有可能的遍歷情況(至少看起來是這樣,它顯然不起作用)。

任何幫助表示贊賞。

我認為問題是getParentNode應該在getParentNode node (RoseTree rootNode xs)上遞歸,所以整個 function 會變成:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM