[Haskell-cafe] Re: Implementing "unionAll"
Heinrich Apfelmus
apfelmus at quantentunnel.de
Thu Feb 18 05:05:46 EST 2010
Leon Smith wrote:
> On Wed, Feb 17, 2010 at 6:58 AM, Heinrich Apfelmus
> <apfelmus at quantentunnel.de> wrote:
>> Ah, I meant to use the union' from your previous message, but I think
>> that doesn't work because it doesn't have the crucial property that the case
>>
>> union (VIP x xs) ys = ...
>>
>> does not pattern match on the second argument.
>
> Ahh yes, my original union' has a bit that looks like this
>
> union' (VIP x xs) (VIP y ys)
> = case cmp x y of
> LT -> VIP x (union' xs (VIP y ys))
> EQ -> VIP x (union' xs ys)
> GT -> error "Data.List.Ordered.unionAll: assumption violated!"
> union' (VIP x xs) (Crowd ys) = VIP x (union' xs (Crowd ys))
>
> For whatever reason, this works in the case of an infinite number of
> lists with my original version, but not the simplified version. By
> applying a standard transformation to make this lazier, we can
> rewrite these clauses as
>
> union' (VIP x xs) ys
> = VIP x $ case ys of
> Crowd _ -> union' xs ys
> VIP y yt -> case cmp x y of
> LT -> union' xs ys
> EQ -> union' xs yt
> GT -> error msg
Oops, I missed this simple rewrite, mainly because the GT case did not
start with the VIP x constructor. :D
Regards,
Heinrich Apfelmus
--
http://apfelmus.nfshost.com
More information about the Haskell-Cafe
mailing list