
On Wed, 2008-11-12 at 10:09 +0000, Paul Keir wrote:
Hi All,
If I have an ADT, say
data T = A String Integer | B Double | C deriving(Eq)
and I want to find if a list (ts) of type T contains an element of subtype "B Double", must my "containsTypeX" function use a second "isTypeX" function as follows:
isTypeB :: T -> Bool isTypeB (B _) = True isTypeB _ = False
containsTypeB :: [T] -> Bool containsTypeB ts = maybe False (\x -> True) (find isTypeB ts)
I understand that while something like "find C ts" will work, "find (isTypeB _) ts" will not, but is there no such thing as a pattern combinator(?), or lambda that could help with this situation. I find I have many individual "isTypeB" functions now.
In addition to what others have said, I recommend using functions like isTypeB :: T -> Maybe Double isTypeB (B d) = Just d isTypeB _ = Nothing You can recover the Bool version of isTypeB just by post-composing with isJust, but this version avoids needing partial functions and often is more what you want (i.e. it's a first-class "pattern"). Combining it with catMaybes is also a common pattern.