[Haskell-cafe] Searching for ADT patterns with elem and find

wren ng thornton wren at freegeek.org
Wed Nov 12 13:36:12 EST 2008


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)

Many other good posts have obviated the original question, but just to 
answer it directly. You can turn isTypeB into a lambda by using a case 
expression:

     isTypeB = \t -> case t of B _ -> True ; _ -> False

And from there you can just inline the definition in order to remove 
isTypeB. Pattern matching in function definitions is just sugar for the 
case expression version, so this transformation is just what the 
compiler would be doing anyways.

-- 
Live well,
~wren


More information about the Haskell-Cafe mailing list