【发布时间】: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。我不懂为什么。我涵盖了getParentNode 和getParentNodeForList 中所有可能的遍历情况(至少看起来是这样,它显然不起作用)。
感谢任何帮助。
【问题讨论】:
-
你能解释一下
getParentNode和getParentNodeList应该做什么吗?我想我可以从名字上猜到getParentNode,但是getParentNodeList有点模棱两可,我不知道你为什么会在getParentNode函数的定义中使用它。 -
getParentNodeList搜索node在玫瑰树儿童中的出现
标签: haskell