[Agda] pattern for All is not matched

Martin Stone Davis martin.stone.davis at gmail.com
Sun Jan 22 20:37:22 CET 2017


Yeah, it can be somewhat annoying. I proposed an enhancement for that 
here <https://github.com/agda/agda/issues/2298#issuecomment-263100695>.


On 01/22/2017 11:09 AM, Sergei Meshveliani wrote:
> On Sun, 2017-01-22 at 10:52 -0800, Martin Stone Davis wrote:
>> Let bindings don't let you match against "datatype patterns", only
>> record patterns. _∷a_ is a datatype pattern, in this sense (List being a
>> datatype, after all). For datatypes, you can use case_of_:
>>
>> open import Function
>>
>> f :  (x m : ℕ) → (xs : List ℕ) → All (_≤ m) (x ∷ xs) → x ≤ m
>> f x m xs xxs≤m =
>>                  case xxs≤m of λ {(x≤m ∷a xs≤m) → x≤m}
> Thank you for explanation.
> Yes, I have written the thing as
>
>    let es = ...
>    in
>    case maximum e es
>    of \
>    { (maximum′ m _ (x≤m ∷a xs≤m)) → let a = f m xs≤m
>                                     in  foo a
>    }
>
> But the corresponding code with one `let' and no `case' looks much more
> clear:
>    let es                           = ...
>        (maximum′ m _ (x≤m ∷a xs≤m)) = maximum e es
>        a                            = f m xs≤m
>    in  foo a
>    
> It is a pity that it is not valid.
>
> ------
> Sergei
>
>
>>
>> On 01/22/2017 10:36 AM, Sergei Meshveliani wrote:
>>> Please, why matching against  (x≤m ∷a xs≤m)
>>> is not type-checked below?
>>>
>>> For the program
>>>
>>> -----------------------------------------------
>>> open import Data.Nat  using (ℕ; _≤_)
>>> open import Data.List using (List; _∷_)
>>> open import Data.List.All as AllM using (All)
>>>                                     renaming (_∷_ to _∷a_)
>>>
>>> f :  (x m : ℕ) → (xs : List ℕ) → All (_≤ m) (x ∷ xs) → x ≤ m
>>> f x m xs xxs≤m =
>>>                  let  (x≤m ∷a xs≤m) = xxs≤m  in  x≤m
>>> --------------------------------------------------
>>>
>>> Agda 2.5.2 reports
>>>
>>>     Expected record pattern
>>>     when checking the let binding x≤m ∷a xs≤m = xxs≤m
>>>
>>> In what place does it expect a record?
>>> Is this a bug in Agda ?
>>>
>>> The variant of
>>>
>>>       f x m xs (x≤m ∷a xs≤m) = x≤m
>>>
>>> is type-checked.
>>>
>>>
>>> In reality, I need to use the pattern like
>>>      
>>>     let (maximum′ m _ (x≤m ∷a xs≤m)) = maximum x xs
>>>     in
>>>     foo m x≤m xs≤m,
>>>
>>> where maximum′ is the constructor for the result record for the
>>> `maximum' function.
>>> Matching against
>>>                   (maximum′ m _ _)
>>>    
>>> is type-checked under this `let', while matching against
>>> (maximum′ m _ (x≤m ∷a xs≤m))
>>> is not
>>> (again, "Expected record pattern").
>>>
>>> Thanks,
>>>
>>> ------
>>> Sergei
>>>
>>> _______________________________________________
>>> Agda mailing list
>>> Agda at lists.chalmers.se
>>> https://lists.chalmers.se/mailman/listinfo/agda
>>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.chalmers.se/pipermail/agda/attachments/20170122/7b209668/attachment.html>


More information about the Agda mailing list