[Ur] Grammar/Parser bug?

Saulo Araujo saulo2 at gmail.com
Sat Oct 8 19:41:20 EDT 2016


Hi Adam,

Thanks for suggesting this workaround. I was able to implement it, but I
have some doubts. Perhaps you can point me to the relevant bits in the
Ur/Web documentation or you can clear them up.

Following your suggestion, I started defining

con concat nm t r = $([nm = t] ++ r)

But the Ur/Web compiler complains

test.ur:1:22: (to 1:37) Couldn't prove field name disjointness
    Con 1:  [nm = ()]
    Con 2:  r
Hnormed 1:  [nm = ()]
Hnormed 2:  r

I tried to please the compiler by changing the definition to

con concat nm t r [[nm] ~ r] = $([nm = t] ++ r)

Now, the compiler complains:

test.ur:5:12: (to 5:14) Invalid FFI mode
test.ur:5:15: (to 5:16) Invalid FFI mode
test.ur:5:17: (to 5:18) Invalid FFI mode
test.ur:5:0: (to 5:4) syntax error: replacing  LTYPE with  VAL
test.ur:5:12: (to 5:14) Invalid FFI mode
test.ur:5:15: (to 5:16) Invalid FFI mode
test.ur:5:17: (to 5:18) Invalid FFI mode
test.ur:5:30: (to 5:31) syntax error: replacing  EQ with  LBRACK
test.ur:16:0: (to 16:0) syntax error found at EOF
Parse failure

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. 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" :)

Sincerely,
Saulo

On Sat, Oct 8, 2016 at 2:05 PM, Adam Chlipala <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
>>
>
> _______________________________________________
> Ur mailing list
> Ur at impredicative.com
> http://www.impredicative.com/cgi-bin/mailman/listinfo/ur
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.impredicative.com/pipermail/ur/attachments/20161008/2e802bc8/attachment.html>


More information about the Ur mailing list