How do I code a tree of objects in Haskell with pointers to parent and children?

后端 未结 6 871
南方客
南方客 2021-02-06 06:49

I\'ve got the following problem: I have a tree of objects of different classes where an action in the child class invalidates the parent. In imperative languages, it is trivial

6条回答
  •  日久生厌
    2021-02-06 07:52

    Couldn't laziness take care of making sure validation doesn't happen too often? That way, you don't need to store the m_valid field.

    For example, if you only validate on save, then you can edit the objects to your hearts content, without revalidating all the time; only when the user presses the 'Save' button is the value of validateDoc computed. Since I don't know for sure what your notion of valid means and what you need it for, I might be totally of the mark.

    Untried & incomplete code:

    data Document = Document { subDocs :: [SubDoc] }
    data SubDoc = SubDoc { content :: String }
    
    addSubDoc :: SubDoc -> (Document -> Document)
    addSubDoc = error "not yet implemented: addSubDoc"
    
    modifySubDoc :: Int -> (SubDoc -> SubDoc) -> (Document -> Document)
    modifySubDoc = error "not yet implemented: modifySubDoc"
    
    
    validateDoc :: Document -> Bool
    validateDoc = all validateSubDoc . subDocs
    
    validateSubDoc :: SubDoc -> Bool
    validateSubDoc = not . null . contents
    

    I'm assuming the overall validity of the document depends only on the subdocuments (simulated here by ensuring that they contain a non-empty string).

    By the way, I think you forgot a a.addChild(b); in main.

提交回复
热议问题