
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: haskell-cafe-bounces@haskell.org
[mailto:haskell-cafe-bounces@haskell.org] 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:tanielsen@gmail.com]
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