jlw501 jlw501 at cs.york.ac.uk
Wed Jan 2 07:32:00 EST 2008

```Good point.
By fold/unfold transformation you get the following:

contains = flip elem [Eureka]
=
contains xs e = flip elem xs e [Expose data structures]
=
contains [] e = False
contains (x:xs) e = flip elem (x:xs) e [Instantiate]
=
contains [] e = False
contains (x:xs) e = elem e x:[] || flip elem xs e [Unfold flip one step]
=
contains [] e = False
contains (x:xs) e = elem e x:[] || contains xs e [Fold back to original
defintion]
=
contains [] e = False
contains (x:xs) = e==x || contains xs e [Substitute]

Apparently, the fold/unfold transformation law will always yield an equally
or more efficient computation. So this begs the question...

contains [] e = False
contains (x:xs) = e==x || contains xs e

OR

contains = flip elem

Neil Mitchell wrote:
>
> Hi
>
>> > contains :: Eq a => [a]->a->Bool
>> > contains [] e = False
>> > contains (x:xs) e = if x==e then True else contains xs e
>>
>> contains = flip elem
>
> And even if not using the elem function, the expression:
>
> if x==e then True else contains xs e
>
> can be written as:
>
> x==e || contains xs e
>
> Thanks
>
> Neil
> _______________________________________________