Hi Paul,
 
maybe False (\x -> True) (find isTypeB ts)
This can be more neatly expressed as:
 
isJust (find isTypeB ts)
 
But your entire thing can be expressed as:
 
containsTypeB ts = any isTypeB ts
 
I recommend reading through the Prelude interface and the List interface, it has many useful functions that will help.
 
Thanks
 
Neil
 


From: haskell-cafe-bounces@haskell.org [mailto:haskell-cafe-bounces@haskell.org] On Behalf Of Paul Keir
Sent: 12 November 2008 10:09 am
To: haskell-cafe@haskell.org
Subject: [Haskell-cafe] Searching for ADT patterns with elem and find

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.

Regards,
Paul

==============================================================================
Please access the attached hyperlink for an important electronic communications disclaimer: 

http://www.credit-suisse.com/legal/en/disclaimer_email_ib.html
==============================================================================