<p dir="ltr"><br>
Le 26 nov. 2014 16:08, &quot;Jesper Cockx&quot; &lt;<a href="mailto:Jesper@sikanda.be">Jesper@sikanda.be</a>&gt; a écrit :<br>
&gt;<br>
&gt; I think this would be a very nice thing to reduce the verbosity of using universe polymorphism. A few remarks:<br>
&gt;<br>
&gt; - If I understand correctly, a telsyntax statement would always contain exactly one visible argument plus any number of hidden and instance arguments before and after? This looks very similar to the idea Andreas proposed in Tallinn for changing the internal representation of hidden function types. So your proposal could be seen as a concrete syntax for this new internal representation.</p>
<p dir="ltr">Yes, that seems right. I haven&#39;t really followed the discussion on grouping of arguments in Tallinn, but it does sound close.</p>
<p dir="ltr">&gt; - Do you want (A B C : Type) to be translated to {i : Level} (A : Set i) {j : Level} (B : Set j) {k : Level} (C : Set k), or to {i j k : Level} (A : Set i) (B : Set j) (C : Set k)? I usually write the latter, though the former is more consistent with the idea of grouping hidden arguments with a visible argument.</p>
<p dir="ltr">The advantage of the later is that you can factor the three Level arguments, so it&#39;s shorter when you have to write it by hand, but it would make much more sense to have it translated to the former.</p>
<p dir="ltr">&gt; - There is a way to make sense of having Type and Group as the return type of a function: &quot;f : ... -&gt; Type&quot; just stands for &quot;f : ... -&gt; Set _&quot;, and &quot;g : ... -&gt; Group0&quot; stands for &quot;g : ... -&gt; Set&quot;, but using g also brings a term of type &quot;GroupStr (g ...)&quot; into scope for instance resolution. Then you could make (A : Set) a synonym for {i : Level} (A : Set i) instead of (A : Set0), so that functions that look non-level-polymorphic can actually be used at any level.</p>
<p dir="ltr">That makes sense for postulates for instance, but not for function definitions, if you want to define a function of type Group -&gt; Group, then you have to provide the group structure on the result and it might be nontrivial.</p>
<p dir="ltr">&gt; On Wed, Nov 26, 2014 at 2:33 PM, Guillaume Brunerie &lt;<a href="mailto:guillaume.brunerie@gmail.com">guillaume.brunerie@gmail.com</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; Hello all,<br>
&gt;&gt;<br>
&gt;&gt; As is well known, it’s currently a bit annoying to use universe<br>
&gt;&gt; polymorphism in Agda because instead of writing<br>
&gt;&gt;<br>
&gt;&gt;   f : (A B C : Type) -&gt; …<br>
&gt;&gt;<br>
&gt;&gt; you have to write<br>
&gt;&gt;<br>
&gt;&gt;   f : {i j k : Level} (A : Set i) (B : Set j) (C : Set k) -&gt; …<br>
&gt;&gt;<br>
&gt;&gt; Would it be a good idea to make the first one a syntactic sugar for<br>
&gt;&gt; the second one?<br>
&gt;&gt; I’m thinking about adding a &quot;telsyntax&quot; keyword, such that you can<br>
&gt;&gt; write for instance<br>
&gt;&gt;<br>
&gt;&gt;   telsyntax {i : Level} (X : Set i) = (X : Type)<br>
&gt;&gt;<br>
&gt;&gt; and then (A B C : Type) (in a telescope) would be automatically translated into<br>
&gt;&gt;<br>
&gt;&gt;   {i : Level} (A : Set i) {j : Level} (B : Set j) {k : Level} (C : Set k)<br>
&gt;&gt;<br>
&gt;&gt; And this is not just about universe management, but it would also be<br>
&gt;&gt; very useful when using instance arguments. For instance if a group is<br>
&gt;&gt; a type (of level 0, say) with a group structure (which will be found<br>
&gt;&gt; by instance search), and you want to write a function taking three<br>
&gt;&gt; groups as arguments you have to write<br>
&gt;&gt;<br>
&gt;&gt;   g : (G H K : Set) {{_ : GroupStr G}} {{_ : GroupStr H}} {{_ :<br>
&gt;&gt; GroupStr K}} -&gt; …<br>
&gt;&gt;<br>
&gt;&gt; But you could say instead<br>
&gt;&gt;<br>
&gt;&gt;   telsyntax (G : Set) {{_ : GroupStr G}} = (G : Group0)<br>
&gt;&gt;   g : (G H K : Group0) -&gt; …<br>
&gt;&gt;<br>
&gt;&gt; And of course you can combine the two, if groups can be at any<br>
&gt;&gt; universe level then the following:<br>
&gt;&gt;<br>
&gt;&gt;   telsyntax {i : Level} (G : Set i) {{_ : GroupStr G}} = (G : Group)<br>
&gt;&gt;   g : (G H K : Group) -&gt; …<br>
&gt;&gt;<br>
&gt;&gt; would be a shorthand for<br>
&gt;&gt;<br>
&gt;&gt;   g : {i j k : Level} {G : Set i} {H : Set j} {K : Set k} {{_ :<br>
&gt;&gt; GroupStr G}} {{_ : GroupStr H}} {{_ : GroupStr K}} -&gt; …<br>
&gt;&gt;<br>
&gt;&gt; which is much less readable and annoying to write.<br>
&gt;&gt;<br>
&gt;&gt; One drawback (in the case of universe levels) is that you don’t have<br>
&gt;&gt; access to the level anymore, but I don’t think that would really be a<br>
&gt;&gt; problem, and you still can make the levels explicit if you need to.<br>
&gt;&gt; Another drawback is that when writing (A : Type) or (G : Group) in a<br>
&gt;&gt; telescope, it makes it look like Type and Group are types, but it’s<br>
&gt;&gt; not the case so it could be confusing (for instance you can’t end a<br>
&gt;&gt; function with &quot;-&gt; Group&quot;). If that’s indeed too confusing, maybe we<br>
&gt;&gt; could use a different notation than a colon, to make it clear that<br>
&gt;&gt; it’s just syntactic sugar (on the other hand, it looks nice with a<br>
&gt;&gt; colon).<br>
&gt;&gt;<br>
&gt;&gt; What do you think?<br>
&gt;&gt;<br>
&gt;&gt; Guillaume<br>
&gt;&gt; _______________________________________________<br>
&gt;&gt; Agda mailing list<br>
&gt;&gt; <a href="mailto:Agda@lists.chalmers.se">Agda@lists.chalmers.se</a><br>
&gt;&gt; <a href="https://lists.chalmers.se/mailman/listinfo/agda">https://lists.chalmers.se/mailman/listinfo/agda</a><br>
&gt;<br>
&gt;<br>
</p>