Brent Yorgey wrote
> Someone did respond to your question, with a link to the data-accessor
> package on Hackage (you could also take a look at fclabels or
> lenses).  Do those help address your issue?

It's not accessing the data that concerns me, it's updating other elements.

Imagine a system that tracks student registration.

data Student = Student { sName :: String
                                 {- ,  ... Other stuff -}
                                 , coursesTaking :: [Course]
                                 }

data Rank = Assist | Assoc | Full

data Instructor = Student { iName :: String
                                    , rank :: Rank               -- defined, say, as   data Rank = Assist | Assoc | Full
                                    
{- ,  ... Other stuff -}
                                    , coursesTeaching :: [Course]
                                    }

data Course = Course { cName :: String
                               , units :: Int
 
                              {- ,  ... Other stuff -}
                               , instructor :: Instructor
                               , enrolledStudents :: [Student]
                               }

Suppose I want a function that drops a student from a class.

drop :: (Course,  Student) -> 
(Course,  Student)

I'm declaring the function as pair to pair because both change.

If I run drop, I get a new Course record and a new Student record. Doesn't that mean I have to change all the Student, Instructor, and Course 
record
s that refer to them, which also means I have to change all the Course 
record
s that refer to them, etc.?

Wouldn't I have to write something like this?

data DataBase = DB { students    :: [Student]
                            , instructors :: [Instructor]
                            , courses     :: [Course]
                            }

drop :: DB -> Course -> Student -> 
DB 

But even if I do that, doesn't that require a lot of code to get everything updated? 
Is there a simple way to write that function? 

In a previous message I guessed that the best way to do it is with Maps, e.g. Map Student [Course] etc.

I'd very much appreciate seeing the recommended code for the drop function.  Thanks.

-- Russ

P.S. I'll admit that I've spent virtually no time with monads and would prefer to avoid them if possible.