agda中类型签名的任意评估

时间:2014-06-08 23:05:12

标签: agda function-signature

所以我有另一个"简单"阿德加问题。我想要一个使用任意评估作为前提和结果的证明。但是,我认为我不太了解类型系统。

作为一个简单的例子,取

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)在上下文中意味着什么?可以构建吗?如何构建?

1 个答案:

答案 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