> I guess one drawback compared to Neil's suggested use of "any" (and
staying with a separate "isTypeB") is that your solution will iterate
over the entire list, regardless of an early hit.
 
Nope, it will stop on the first one - Haskell is lazy like that :-)
 
Thanks, Neil


 


________________________________

        From: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] On Behalf Of Paul Keir
        Sent: 12 November 2008 1:45 pm
        To: Tom Nielsen
        Cc: haskell-cafe@haskell.org
        Subject: RE: [Haskell-cafe] Searching for ADT patterns with elem
and find
        
        

        Thanks Tom,
        
        That is indeed a very elegant solution; I too often forget about
the wonders of list comprehension.
        
        I guess one drawback compared to Neil's suggested use of "any"
(and staying with a separate "isTypeB") is that your solution will
iterate over the entire list, regardless of an early hit.
        
        But I don't think your second (as-pattern) solution for findBs
is ugly; I quite like it actually.
        
        Cheers,
        Paul
        
        
        -----Original Message-----
        From: Tom Nielsen [mailto:[EMAIL PROTECTED]
        Sent: Wed 12/11/2008 12:39
        To: Paul Keir
        Cc: haskell-cafe@haskell.org
        Subject: Re: [Haskell-cafe] Searching for ADT patterns with elem
and find
        
        somebody pointed out a few months back that list comprehensions
do this nicely:
        
        containsTypeB ts = not $ null [x | (B x) <- ts]
        
        no need for defining isTypeB.
        
        
        not quite sure how you would write findBs :: [T]->[T]
succinctly; maybe
        
        findBs ts = [b | b@(B _) <- ts]
        
        or
        
        findBs ts = [B x | (B x) <- ts]
        
        both of them compile but the first is ugly and the second is
        inefficient (Tags a new T for every hit).
        
        
        Tom
        
        
        2008/11/12 Paul Keir <[EMAIL PROTECTED]>:
        > 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
        >
        > _______________________________________________
        > Haskell-Cafe mailing list
        > Haskell-Cafe@haskell.org
        > http://www.haskell.org/mailman/listinfo/haskell-cafe
        >
        >
        
        


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

http://www.credit-suisse.com/legal/en/disclaimer_email_ib.html
==============================================================================
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to