我在以下程序的最后一行收到类型错误:
Require Import List.
Import ListNotations.
(* This computes to 10 *)
Compute (fold_right plus 0 [1;2;3;4]).
(* I want this to compute to [5;6;7;8] but it gives a type error instead *)
Compute (fold_right app [] [[5;6]; [7;8]]).
这是我得到的错误:
Error:
The term "app" has type "forall A : Type, list A -> list A -> list A" while it is expected to have type
"Type -> ?A -> ?A" (cannot instantiate "?A" because "A" is not in its scope).
我真的不明白为什么我会收到这个错误。 app
和plus
之间的区别是什么?在app
是单态plus
函数时,它是否与nat -> nat -> nat
具有多态性有关吗?
如果重要,我的Coq版本是8.5。
答案 0 :(得分:6)
你猜对了:它确实与app
具有多态性有关。问题是Coq允许根据相应的术语是否应用于参数来推断隐式参数。更确切地说,非最大含义仅在术语应用于某些内容时插入,但如果该术语单独使用(例如app
)则不插入。有两种方法可以解决这种情况:
1-强制Coq为该实例推断某些内容,如fold_right (@app _) [] [[5; 6]; [7; 8]]
。
2-使用一个全局声明,使最大限度地插入类型参数:Arguments app {_} _ _.
。有关这方面的详细信息,请查看reference manual