Syntax 阿格达:什么意思?

Syntax 阿格达:什么意思?,syntax,pattern-matching,agda,unification,Syntax,Pattern Matching,Agda,Unification,我在看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

我在看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
所以我猜这是必要的。但我不明白这到底是为了什么。我试着进去看看,但找不到任何关于它的东西

谢谢!

首先,在

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

这正是a的意思:

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

首先,在

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

这正是a的意思:

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