所以我有另一个"简单"阿德加问题。我想要一个使用任意评估作为前提和结果的证明。但是,我认为我不太了解类型系统。
作为一个简单的例子,取
f : {S : Set} -> (a : S)
-> ( R : S -> Set)
-> (R a)
f aa rr = rr aa
有编译错误
Set !=< rr aa of type Set1
when checking that the expression rr aa has type rr aa
当然
f : {S : Set} -> (a : S)
-> ( R : S -> Set)
-> Set
f aa rr = rr aa
编译好
和
一样f : {S : Set} -> (a : S)
-> ( R : S -> Set)
-> (R a)
-> (R a)
f _ _ ra = ra
(R a)
在上下文中意味着什么?可以构建吗?如何构建?
答案 0 :(得分:2)
在您的第一个示例中,表达式rr aa
的类型为Set
,因为它是将aa
类型S
应用于函数rr
的结果类型为S -> Set
。
您的函数的类型签名要求结果类型为R a
。给定参数的命名,预期结果类型为rr aa
。类型检查器现在尝试将预期类型(rr aa
)与表达式类型(Set
)统一并失败。
实际上,上面给出的类型函数与类型理论不一致:
no-f : (f : {S : Set} → (a : S) → (R : S → Set) → R a) → ⊥
no-f f = f tt (λ _ → ⊥)
换句话说,假设存在上述类型的函数,则可以生成空类型(⊥)的元素。因此,一般情况下,如果没有其他要求,则无法构造R a
类型的元素。
上面使用的进口:
open import Data.Empty
open import Data.Unit