Proof 在Agda中定义记录时未解析的图元

Proof 在Agda中定义记录时未解析的图元,proof,agda,Proof,Agda,考虑以下代码: 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 :

考虑以下代码:

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+

如何提供提示或以其他方式更改代码,使其在编译时不会出现此警告


我当然可以通过取消隐藏参数来消除它,但这意味着我必须在任何地方指定显式参数,即使在不需要显式参数的地方…

您可以利用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}

啊,我不知道这个把戏。非常感谢您快速而精彩的回答!