<div dir="ltr"><div>The difference is that you are not allowed to pattern match on datatype parameters, since they</div><div> are not stored in the constructor. In a right-hand side you can give the parameters to guide the</div><div> type checker, but they are thrown out during elaboration.</div><div><br></div><div>/ Ulf<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, May 1, 2020 at 10:56 PM Martin Escardo <<a href="mailto:m.escardo@cs.bham.ac.uk">m.escardo@cs.bham.ac.uk</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Thanks, that works. (<a href="https://github.com/agda/agda/issues/4632" rel="noreferrer" target="_blank">https://github.com/agda/agda/issues/4632</a>)<br>
<br>
I still wonder why refl {x} and refl {_} {_} {x} behave differently <br>
according to context.<br>
<br>
Best,<br>
Martin<br>
<br>
On 01/05/2020 21:16, <a href="mailto:ulf.norell@gmail.com" target="_blank">ulf.norell@gmail.com</a> wrote:<br>
> pattern reflpv x = refl {x = x}<br>
> <br>
> / Ulf<br>
> <br>
> <br>
> On Fri, May 1, 2020 at 6:39 PM Martin Escardo <<a href="mailto:m.escardo@cs.bham.ac.uk" target="_blank">m.escardo@cs.bham.ac.uk</a> <br>
> <mailto:<a href="mailto:m.escardo@cs.bham.ac.uk" target="_blank">m.escardo@cs.bham.ac.uk</a>>> wrote:<br>
> <br>
>     Consider the following, which works:<br>
> <br>
>     data _≡_ {ℓ} {X : Set ℓ} : X → X → Set ℓ where<br>
>         refl : {x : X} → x ≡ x<br>
> <br>
>     pattern reflp x = refl {x}<br>
>     pattern reflv x = refl {_} {_} {x}<br>
> <br>
>     J : ∀ {i j} (X : Set i) (A : (x y : X) → x ≡ y → Set j)<br>
>         → ((x : X) → A x x (reflv x))<br>
>         → (x y : X) (p : x ≡ y) → A x y p<br>
>     J X A f x x (reflp x) = f x<br>
> <br>
>     The idea is to make the argument of refl explicit if we wish, via the<br>
>     pattern definition.<br>
> <br>
>     However, the patterns behave differently "as patterns" and "as values".<br>
>     For instance, the following doesn't work:<br>
> <br>
>     J : ∀ {i j} (X : Set i) (A : (x y : X) → x ≡ y → Set j)<br>
>         → ((x : X) → A x x (reflp x))  -- error here<br>
>         → (x y : X) (p : x ≡ y) → A x y p<br>
>     J X A f x x (reflp x) = f x<br>
> <br>
>     This doesn't work either:<br>
> <br>
>     J : ∀ {i j} (X : Set i) (A : (x y : X) → x ≡ y → Set j)<br>
>         → ((x : X) → A x x (reflv x))<br>
>         → (x y : X) (p : x ≡ y) → A x y p<br>
>     J X A f x x (reflv x) = f x -- error here<br>
> <br>
>     It would be desirable to have a definition that works both as a pattern<br>
>     and as a value. Is that possible?<br>
> <br>
>     Thanks,<br>
>     Martin<br>
>     _______________________________________________<br>
>     Agda mailing list<br>
>     <a href="mailto:Agda@lists.chalmers.se" target="_blank">Agda@lists.chalmers.se</a> <mailto:<a href="mailto:Agda@lists.chalmers.se" target="_blank">Agda@lists.chalmers.se</a>><br>
>     <a href="https://lists.chalmers.se/mailman/listinfo/agda" rel="noreferrer" target="_blank">https://lists.chalmers.se/mailman/listinfo/agda</a><br>
> <br>
<br>
-- <br>
Martin Escardo<br>
<a href="http://www.cs.bham.ac.uk/~mhe" rel="noreferrer" target="_blank">http://www.cs.bham.ac.uk/~mhe</a><br>
</blockquote></div>