![](/img/trans.png)
[英]Finding the number of the neighbours of a given node of a multiway tree (rose tree) in Haskell
[英]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
是空的。 我不懂為什么。 我在getParentNode
和getParentNodeForList
中涵蓋了所有可能的遍歷情況(至少看起來是這樣,它顯然不起作用)。
任何幫助表示贊賞。
我認為問題是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.