Coq多态函数没有显式类型

时间:2017-07-11 04:05:24

标签: coq

我有一个用Coq术语编写的“枚举”函数(它叫做什么?)。此函数使用起来很烦人,因为它要求在使用A函数时显式提供l(列表enumerate中元素的类型)。有没有办法避免需要明确地将A作为参数传递?

(* [a, b] -> [(0,a), (1,b)] *)
Fixpoint enumerate (A : Type) (l : list A) : list (nat * A) :=
  let empty : (list (nat * A)) := nil in
  let incr_pair xy := match xy with 
   | (x, y) => ((S x), y)
  end in 
  match l with
  | nil => empty
  | (x :: xs) => (O, x) :: (map incr_pair (enumerate A xs))
  end.

我希望能够写出类似

的内容
Fixpoint enumerate (l : list A) : list (nat * A) := ...

可能还有一些额外的语法来确定A到底是什么。

1 个答案:

答案 0 :(得分:3)

将参数放在括号中以使其默认为隐式(请参阅第2.7.4节here)。此外,您应该使用nat累加器以非二次方式编写此函数。

Require Import Lists.List.
Import ListNotations.

Fixpoint enumerate_from {A : Type} (n : nat) (l : list A) : list (nat * A) :=
  match l with
  | [] => []
  | x :: xs => (n, x) :: enumerate_from (S n) xs
  end.

Definition enumerate {A} l : list (nat * A) := enumerate_from 0 l.

Compute (enumerate [3; 4; 5]). (* prints [(0, 3); (1, 4); (2, 5)] *)