Types 阿格达。冒号前后的参数

Types 阿格达。冒号前后的参数,types,syntax,parameters,agda,colon,Types,Syntax,Parameters,Agda,Colon,定义数据类型时,我可以在冒号之前“传递”一些参数 data Image_э_ { A B : Set} : (f : A → B) → B → Set where im : {f : A → B} → (x : A) → Image f э f x 但我似乎无法在函数声明中做到这一点,原因不明 exIm {A B : Set} : {f : A → B}{y : B} → Image f э y → B exIm {y = y} _ = y 冒号前后传递参数的根本区别是什么?老实说

定义数据类型时,我可以在冒号之前“传递”一些参数

data Image_э_  { A B : Set} : (f : A → B) →  B → Set where
   im : {f : A → B} → (x : A) → Image f э f x
但我似乎无法在函数声明中做到这一点,原因不明

exIm {A B : Set} : {f : A → B}{y : B} → Image f э y → B
exIm {y = y} _ = y
冒号前后传递参数的根本区别是什么?老实说,我不知道为什么会有人想在冒号之前传递参数,以及它能带来什么好处。也许,这样的数据类型定义会使冒号之前的参数在构造函数中可见

我不知道为什么会有人想在冒号之前传递参数 它能带来什么好处

在数据类型声明中,在冒号之前传递的参数在 数据类型定义的主体

我认为这将是一个很好的功能要求。我们本来可以的

typeOf {A : Set} : A -> Set
typeOf a = A -- A is in scope because `{A : Set}` was before the colon

因此,请随意打开一个新的问题,建议进行更改:

我要补充:在
数据
定义的冒号索引左侧,您可以获得一个大的额外功能,即可以避免大小问题。使用左冒号索引,您可以拥有
数据图像{ab:Set}:(f:A)→ (B)→  B→ Set
,而使用纯冒号右边索引的等价物必须是
数据图像1101;{ab:Set}(f:A→ (B)→  B→ 设置₁
,因为构造函数存储集合
A
B
。@JamesWood Agda现在足够聪明,可以检测参数,即使它们不在冒号的左边。所以在这种情况下,你不会遇到尺寸问题。