[Haskell-beginners] Disjunction

Antoine Latter aslatter at gmail.com
Fri Dec 10 01:15:38 CET 2010


On Thu, Dec 9, 2010 at 6:13 PM, Antoine Latter <aslatter at gmail.com> wrote:
> On Thu, Dec 9, 2010 at 6:02 PM, Russ Abbott <russ.abbott at gmail.com> wrote:
>> I recently was writing code long these lines.
>>
>> f x = p1 x || p2 x || ... || pn x
>>
>> I would have liked to write that in pointfree form but couldn't find a
>> library function to do it.
>>
>> I created this.
>>
>> disj :: [a -> Bool] -> a -> Bool
>> disj ps = (\x -> or $ map ($x) ps)
>>
>> disj2 p1 p2 = disj [p1, p2]
>> disj3 p1 p2 p3 = disj [p1, p2]
>> disj4 p1 p2 p3 p4 = disj [p1, p2]
>> ...
>>
>> With that I can write my function as follows.
>>
>> f = disj pi p2 p3 ... pn
>>
>> Is there a standard way to do this?
>>
>
> Assuming you have in instance of Applicative for ((->) r) in scope:
>
> (<||>) :: (r -> Bool) -> (r -> Bool) -> (r -> Bool)
> (<||>) = liftA2 (||)
>
> then you could say:
>
> f = p1 <||> p2 <||> p3 ...
>

And if you're not interested in playing tricks with liftA2 there's always:

p1 <||> p2 = \x -> p1 x || p2 x

Antoine



More information about the Beginners mailing list