Marc Weber wrote:
val json_record : ts ::: {Type}     -- implicit. is automatically inferred
     ->  folder ts                    -- first arg?
     ->  $(map json ts)               -- second arg?
     ->  $(map (fn _ =>  string) ts)   -- third arg?
     ->  json $ts                     -- result type?

This is just normal function type syntax, so the questions about "argument numbering" aren't particularly interesting. (Your answers are correct.)

1) map json?
   Now: What does "map json" exacly mean?

The built-in constructor function [map] applies a function to every field of a type-level record, constructing a new record based on the results. It's really just like normal 'map' from functional programming.

What does mapping over a class (json is a class?) do?

In Ur, a class is just a type-level function, mapping the indices into the class internal implementation. The answer to your question follows from that. Alternatively, another way of putting it is that the constructor [map json ts] denotes a type-level record with a field for each entry of [ts], where each field contains a [json] instance for the appropriate type.

   Is map described somewhere? It seems to be a primop because its listed
   in the syntax files and in the lexer file.

The manual gives a complete description of its syntax and semantics, though not necessarily in a form accessible to people without expertise in semantics.

   That also seems to be the reason why map is called mp in all
   remaining files (eg list.ur)

Right.

2) number of arguments? I'm still totally missing the point. json_record
     is used like this:

         type address = {StreetAddress : string,
                         City : string,
                         State : string,
                         PostalCode : string}


         val json_address : json address = json_record {StreetAddress = 
"streetAddress",
                                                        City = "city",
                                                        State = "state",
                                                        PostalCode = 
"postalCode"}
     only one argument is passed - however json_record still has 3
     explicit ones?

       ->  folder ts                    -- first arg?
       ->  $(map json ts)               -- second arg?
       ->  $(map (fn _ =>  string) ts)   -- third arg?

The first two are inferred, because they meet Ur's rules for being considered type class witnesses. A folder is always a type class witness, and the second argument qualifies because it is a record of type class witnesses, which are considered to be witnesses themselves.

     Which section of the manual do I have to understand so that I can
     follow what ur is doing here?

I'm not sure it's all documented, but the closest thing I see now is in Section 4.3, in the paragraph beginning "Handling of implicit."

3) is it possible to write a generic show function which does not
    require json_record to be called for each possible record type?

It's only possible if you don't want the output to depend on the record field names. Ur provides no way to introspect on the syntax of field names.

_______________________________________________
Ur mailing list
[email protected]
http://www.impredicative.com/cgi-bin/mailman/listinfo/ur

Reply via email to