请考虑以下代码:
module UnresolvedMeta where
record Test (M : Set) : Set1 where
field
_≈_ : M -> M -> Set
_⊕_ : M -> M -> M
assoc⊕ : ∀ {r s t} -> ((r ⊕ s) ⊕ t) ≈ (r ⊕ (s ⊕ t))
data ℕ : Set where
n0 : ℕ
suc : ℕ -> ℕ
data _==_ : ℕ -> ℕ -> Set where
refl== : ∀ {k} -> k == k
_+_ : ℕ -> ℕ -> ℕ
k + n0 = k
k + suc m = suc (k + m)
lem-suc== : ∀ {k m} -> k == m -> suc k == suc m
lem-suc== refl== = refl==
assoc+ : ∀ {i j k} -> ((i + j) + k) == (i + (j + k))
assoc+ {i} {j} {n0} = refl== {i + j}
assoc+ {i} {j} {suc k} = lem-suc== (assoc+ {i} {j} {k})
thm-ℕ-is-a-test : Test ℕ
thm-ℕ-is-a-test = record {
_⊕_ = _+_;
_≈_ = _==_;
assoc⊕ = assoc+
}
当加载Agda(版本2.3.2.2)时,Agda会在倒数第二行打印错误“以下位置的未解决的元数据”:
assoc⊕ = assoc+
并特别指向assoc +。
如何提供提示或以其他方式更改代码,以便在没有此警告的情况下进行编译?
我当然可以通过取消隐藏参数来摆脱它,但这意味着我必须在任何地方指定显式参数,即使在不需要它的地方......
答案 0 :(得分:1)
您可以利用Agda允许您甚至在lambda抽象中指定隐式参数的事实。更具体地说,你可以这样写:
λ {r s t} → assoc+ {r} {s} {t}
-- with a type {r s t : ℕ} → ((r + s) + t) == (r + (s + t))
事实上,用上面的表达式替换assoc+
会让编译器感到高兴。似乎统一对最后一个参数(t
)有问题,所以我们甚至可以忽略r
和s
并且只明确填写t
:
assoc⊕ = λ {_ _ t} → assoc+ {k = t}