[Ur] Grammar/Parser bug?

Adam Chlipala adamc at csail.mit.edu
Sat Dec 31 14:51:59 EST 2016


OK, after much anticipation... I finally made the Ur/Web grammar change 
that should make your original code Just Work.

On 10/12/2016 01:50 PM, Adam Chlipala wrote:
> On 10/08/2016 07:41 PM, Saulo Araujo wrote:
>> Thanks for suggesting this workaround. I was able to implement it, 
>> but I have some doubts. [...]
>>
>> After some trial and error, the compiler was happy with
>>
>> con concat nm t r = [[nm] ~ r] => $([nm = t] ++ r)
>>
>> Which brings me the question: what is [[nm] ~ r] => $([nm = t] ++ r)? 
>> Besides from the "=>" token, it looks like the type of a function 
>> that produces a record from a disjointness proof.
>
> Oh, I was too quick to suggest my version without actually running it 
> through Ur/Web.  Sorry about that.
>
> [=>] is a guard, saying "you only get a value of this type (to the 
> right of the arrow) if you can prove this constraint (to the left)."
>
> It looks like I might actually need to extend the parser to make your 
> example workable.  Stay tuned....
>
>> Indeed, the compiler accepts
>>
>> val fullName : concat #First string [Last = string] = fn [[First] ~ 
>> [Last = string]] => {First = "Saulo", Last = "Araujo"}
>>
>> Surprisingly, however, besides fullName being a function, I can 
>> manipulate it like a record
>>
>> val first : string = fullName.First
>>
>> Which reminds me of the Queen song "A Kind of Magic" :)
>
> The type-inference engine automatically discards guards whose 
> constraints can be proved, so it isn't so magic after all. ;)
>
>> Sincerely,
>> Saulo
>>
>> On Sat, Oct 8, 2016 at 2:05 PM, Adam Chlipala <adamc at csail.mit.edu 
>> <mailto:adamc at csail.mit.edu>> wrote:
>>
>>     It does seem likely that the parser isn't allowing qualified
>>     names in record literals.  The problem is easy to work around by
>>     defining a type synonym that you use instead.  Here's some code
>>     (not actually run through Ur/Web yet!):
>>         type blah x y z = $([x = y] ++ z)
>>         ... where type t = blah A.n1 A.t1 A.t2
>>     It may need extra kind annotations.
>>
>>
>>     On 10/07/2016 08:42 AM, Saulo Araujo wrote:
>>
>>         Hi,
>>
>>         I am trying to do something like
>>
>>         signature ARGUMENTS = sig
>>             con n1 :: Name
>>             con t1 :: Type
>>             con t2 :: {Type}
>>             constraint [n1] ~ t2
>>         end
>>
>>         signature RESULT = sig
>>             type t
>>         end
>>
>>         functor Functor(A : ARGUMENTS) : RESULT where type t =
>>         $([A.n1 = A.t1] ++ A.t2) = struct
>>             open A
>>
>>             type t = $([n1 = t1] ++ t2)
>>         end
>>
>>         but the Ur/Web compiler complains saying:
>>
>>         test.ur:12:58: (to 12:60) syntax error: deleting CSYMBOL DOT
>>         Parse failure
>>
>>         Apparently, one cannot construct type-level records by
>>         projecting name variables from a module. Is this a
>>         grammar/parser bug? If so, is there a workaround?
>>
>>         Sincrely,
>>         Saulo
>>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.impredicative.com/pipermail/ur/attachments/20161231/944f93e3/attachment.html>


More information about the Ur mailing list