Types Agda函数,类型上的函数匹配
我想创建一个helper函数,它将从索引或参数化类型中获取一个术语并返回该类型参数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[]可能会有问题,但是当类型被索引时会发生什么问题?如果去掉隐式参数,您可以非常轻松地
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