[Ur] Grammar/Parser bug?
Adam Chlipala
adamc at csail.mit.edu
Wed Oct 12 13:50:20 EDT 2016
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
>
>
> _______________________________________________
> Ur mailing list
> Ur at impredicative.com <mailto:Ur at impredicative.com>
> http://www.impredicative.com/cgi-bin/mailman/listinfo/ur
> <http://www.impredicative.com/cgi-bin/mailman/listinfo/ur>
>
>
>
>
> _______________________________________________
> 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/20161012/9be3a461/attachment.html>
More information about the Ur
mailing list