阿格达:`.(` 是啥意思?

Posted

技术标签:

【中文标题】阿格达:`.(` 是啥意思?【英文标题】:Agda: what does `.(` mean?阿格达:`.(` 是什么意思? 【发布时间】:2021-02-03 21:38:45 【问题描述】:

我正在查看agda-stdlib/src/Data/Vec/Base.agda 中的代码 并在

中看到.(
take : ∀ m n → Vec A (m + n) → Vec A m
take m xs          with splitAt m xs
take m .(ys ++ zs) | (ys , zs , refl) = ys

我尝试删除它前面的. 并得到以下错误:

Could not parse the left-hand side
take m (ys ++ zs) | (ys , zs , refl)
Operators used in the grammar:
  ++ (infixr operator, level 5) [_++_ (/Users/fss/Dropbox/Documents/projects/Coding/dev/agda/agda-stdlib/src/Data/Vec/Base.agda:99,1-5)]            
  ,  (infixr operator, level 4) [_,_ (/usr/local/Cellar/agda/2.6.1/share/x86_64-osx-ghc-8.10.1/Agda-2.6.1/lib/prim/Agda/Builtin/Sigma.agda:9,15-18)]
when scope checking the left-hand side
take m (ys ++ zs) | (ys , zs , refl) in the definition of take

所以我猜这是必要的。但我不明白它到底是为了什么。我试图查看https://agda.readthedocs.io/en/v2.6.1.1,但找不到任何相关信息。

谢谢!

【问题讨论】:

【参考方案1】:

首先,在

take m (ys ++ zs) 

模式ys ++ zs 无效,因为它不是应用于其他模式的构造函数。如果您考虑一下,通常将模式匹配作为函数应用程序是没有意义的,因为您需要能够反转每个函数。

然而,在

take : ∀ m n → Vec A (m + n) → Vec A m
take m xs          with splitAt m xs
take m .(ys ++ zs) | (ys , zs , refl) = ys

我们也对splitAt 的结果进行模式匹配。第三个参数的类型是(ys ++ zs) == xs,构造函数refl的类型是(ys ++ zs) == (ys ++ zs)。通过统一,这意味着xs ~ (ys ++ zs),因此take 的第二个参数在此子句中不能是ys ++ zs 以外的任何内容。

这正是dot-pattern 的含义:

当参数的唯一类型正确值由为其他参数指定的模式确定时,可以使用点模式(也称为不可访问模式)。点模式的语法是.t

【讨论】:

以上是关于阿格达:`.(` 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

“?”是啥意思?在 Erlang 中是啥意思? [复制]

“this”这个词是啥意思,“static”是啥意思?

“||”是啥意思在 var 语句中是啥意思? [复制]

CVE是啥意思,CVE是啥意思

“内容”是啥意思:在招摇/openapi“响应”中是啥意思:

TypeScript 这个语法“-?”是啥意思? (破折号问题)是啥意思?