
You are still not being clear. You have data LogMessage = LogMessage MessageType TimeStamp String | Unknown String deriving (Show, Eq)
So if it's Unknown with a string then it will not be inserted into the MessageTree The only thing I have to find out if LogMessage contains this.
Question 1. Your description seems contradictory. The first sentence is talking about the Unknown case. The second sentence appears to be talking about the other case. Do you mean should_discard (LogMessage _ _ _) = False should_discard (Unknown s) = ...s contains magic... or should_discard (LogMessage _ _ s) = ...s contains magic... should_discard (Unknown _) = False or should_discard (LogMessage Error _ s) = ...s contains magic... should_discard _ = False or what? Question 2. What do you mean by "contains"? Do you mean - is exactly equal to - is equal to ignoring leading and trailing white space and treating runs of white space as single spaces - is equal to ignoring alphabetic case - equality up to some other predicate - contains a substring equal to (this is what I first thought you meant) - contains a substring equivalent to up to some predicate or something else? In short, before you can ask how to do "this", you have to say in plain words what "this" IS. The _answer_ will be concerned with Haskell, but _the way you should ask such questions_ is not. In any programming language, whatever code you write is going to have *some* precise meaning. The industry as a whole has a huge problem with differences between what people *want* their program to mean/do and what it *does* mean/do. We haven't a hope of detecting such problems in good time if we aren't clear about what it is that we want. Here's another tip. Some people find it helps. Before you start to write a function, just write a stub (others have shown you examples, using 'undefined' as the body; that's a stub), and write test cases that call it. This may help to clarify your ideas about what you want the function to do with _those_ examples, and thereby about others.