首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Agda:什么是‘(’指什么?

Agda:什么是‘(’指什么?
EN

Stack Overflow用户
提问于 2020-10-21 02:07:14
回答 1查看 208关注 0票数 1

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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里查找,但是找不到任何关于它的东西。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-21 08:11:33

首先,在

代码语言:javascript
复制
take m (ys ++ zs) 

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

但是,在

代码语言:javascript
复制
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以外的任何其他参数。

这正是点状图案的含义:

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64455670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档