Types Agda函数,类型上的函数匹配

Types Agda函数,类型上的函数匹配,types,agda,Types,Agda,我想创建一个helper函数,它将从索引或参数化类型中获取一个术语并返回该类型参数 showLen : {len : ℕ} {A : Set} -> Vec A len -> ℕ showLen ? = len showType : {len : ℕ} {A : Set} -> Vec A len -> Set showType ? = A 这可能吗?(我可以看到showType[]可能会有问题,但是当类型被索引时会发生什么问题?如果去掉隐式参数,您可以非常轻松地

我想创建一个helper函数,它将从索引或参数化类型中获取一个术语并返回该类型参数

showLen : {len :  ℕ} {A : Set} -> Vec A len -> ℕ
showLen ? = len

showType : {len :  ℕ} {A : Set} -> Vec A len -> Set
showType ? = A

这可能吗?(我可以看到
showType[]
可能会有问题,但是当类型被索引时会发生什么问题?

如果去掉隐式参数,您可以非常轻松地实现这一点:

showLen : (len : ℕ) (A : Set) → Vec A len → ℕ
showLen len _ _ = len
事实上,我们可以同时做这两件事:

open import Data.Product

showBoth : (len : ℕ) (A : Set) → Vec A len → ℕ × Set
showBoth len A _ = len , A
然后,如果要调用函数并需要指定隐藏参数,则过程类似:

vec : Vec ℕ 4
vec = replicate {4} 0
现在,我们将此应用于上面给出的
showtheet

showBoth : {len : ℕ} {A : Set} → Vec A len → ℕ × Set
showBoth {len} {A} _ = len , A

现在,如果你的论点顺序错误;例如,您想显式地给
一个
参数,但不给
n
参数,您必须这样做:

vec₂ : Vec ℕ 4
vec₂ = replicate {_} {ℕ} 0
现在,如果您需要填写第n个隐式参数,这将很快变得乏味。因此,Agda为我们提供了通过名称引用它们的选项:

vec₃ : Vec ℕ 4
vec₃ = replicate {A = ℕ} 0
它使用类型签名中给定的名称。定义函数时也可以使用此选项:

showType : {len : ℕ} {A : Set} → Vec A len → Set
showType {A = Type} _ = Type
showType : {len : ℕ} {A : Set} → Vec A len → Set
showType {A = Type} _ = Type