[Ur] Pattern Matching

David Snider david at davidsnider.net
Wed May 29 09:57:46 EDT 2013


Let's say I rewrite that as:

fun zip a b =
   case (a, b) of
       (a :: as, b :: bs) => (a, b) :: zip as bs
     | _ => []

This throws a unification failure until I write:

fun blah () = (zip (1::[]) (2::[]))

At which point the compiler is able to infer the types and all compiles 
correctly

Is there some reason that the compiler can't/shouldn't default to:

fun zip [t] [t2] (a : list t) (b : list t2) : list (t * t2) =
   case (a, b) of
       (a :: as, b :: bs) => (a, b) :: zip as bs
     | _ => []

when unification isn't possible?

On 05/28/2013 09:26 AM, Adam Chlipala wrote:
> On 05/28/2013 06:15 AM, David Snider wrote:
>> In standard ML you can write
>>
>> fun zip _ _ = []
>>   | zip (a::as) (b::bs) = (a,b) :: (zip as bs)
>>
>> What would be the Ur equivalent of this kind of pattern matching?
>
> I'm assuming your code has a bug in the ordering of the patterns, 
> which I fix below.
>
> fun zip [t] (a : list t) (b : list t) : list (t * t) =
>   case (a, b) of
>       (a :: as, b :: bs) => (a, b) :: zip as bs
>     | _ => []
>
>
> _______________________________________________
> Ur mailing list
> Ur at impredicative.com
> http://www.impredicative.com/cgi-bin/mailman/listinfo/ur




More information about the Ur mailing list