多型
在前面所定義的鍊錶中,鍊錶的元素都是自然數,(或者partitialmap中以乙個二元元組為元素),但這些都存在著乙個問題:所有型別的鍊錶都在定義的都限制了鍊錶的元素為某乙個確定的型別,這樣就不太靈活了,如果需要定義的鍊錶型別比較多的話,那麼就需要為每一種型別的鍊錶單獨寫一段宣告**。
比如,需要乙個布林型別的鍊錶:
inductive boollist : type :=|bool_nil
| bool_cons (b : bool) (l : boollist).
為了避免這樣的重複,coq提供了一種稱為多型的宣告機制:
inductive list (x:type) : type :=check list.|nil
| cons (x : x) (l : list x).
(* ===> list : type -> type *)
check (nil nat).
(* ===> nil nat : list nat *)
check (cons nat 3 (nil nat)).
(* ===> cons nat 3 (nil nat) : list nat *)
check nil.
(* ===> nil : forall x : type, list x *)
check cons.
(* ===> cons : forall x : type, x -> list x -> list x *)
這種型別的宣告語句需要在宣告該型別的變數時多添建乙個引數:元素的型別。
arguments nil .arguments cons _ _.
用同樣的方法可以定義元組:
inductive prod (x y : type) : type :=|pair (x : x) (y : y).
arguments pair _ _.
notation
"( x , y )
" := (pair x y).
以函式為引數的函式
和許多現代程式語言一樣coq允許函式作為引數傳遞給其他函式或者作為返回結果,如下:
definition doit3times (f:x->x) (n:x) : x :=f (f (f n)).example test_doit3times: doit3times minustwo 9 = 3.
proof. reflexivity. qed.
將這類函式稱為高階函式,下面是乙個比較有用的高階函式,以乙個鍊錶以及布林型別的函式作為引數,然後返回乙個新的鍊錶這個鍊錶中的元素都能滿足使那個布林函式返回true,filter
fixpoint evenb (n:nat) : bool :=match n with| o => true
| s o => false
| s (s n'
) => evenb n
'end.
fixpoint evenb (n:nat) :
bool :=match n with
| o => true
| s o => false
| s (s n'
) => evenb n
'end.
example test_filter1: filter evenb [
1;2;3;4] = [2;4
].proof. reflexivity. qed.
匿名函式:一般的函式在定義的時候都需要宣告其函式名,然而在將函式作為引數傳遞給另乙個函式的時候,可以使用匿名函式:
example test_anon_fun': doit3times (fun n => n * n) 2 = 256
.proof. reflexivity. qed.
此外,還有乙個比較有用的高階函式,同樣的以乙個函式以及乙個鍊錶作為引數,然後對鍊錶中的每個元素都執行一次函式的操作,將函式的返回值插入乙個新煉表中,稱為map:
fixpoint map (f:x->y) (l:list x) : (list y) :=match l with| =>
| h :: t =>(f h) :: (map f t)
end.
example test_map1: map (fun x => plus 3 x) [2;0;2] = [5;3;5
].proof. reflexivity. qed.
C 基礎 多型
多型 為了程式的可擴充套件性,開放封閉原則 對修改封閉,對擴充套件開放 多型就是指不同物件收到相同訊息時,會產生不同的行為,同乙個類在不同的場合下表現出不同的行為特徵。多型的作用 把不同的子類物件都當做父類來看,可以遮蔽不同子類物件之間的差異性,寫出通用的 做出通用的程式設計,已以適應需求的不斷變化...
JAVA基礎 多型
概念 乙個事物的多種形態 多型前提和體現 1.有繼承關係或者實現關係 2.有方法重寫 3.有父類引用指向子類物件 父類 public class fu 子類 public class zi extends fu public class demo 1.提高了程式的維護性 由繼承保證 我的理解 1.如...
java 基礎 多型
4.8 多型 定義 某一類事物的多種存在形態。例 動物中貓,狗。貓這個物件對應的型別是貓型別 貓 x new 貓 同時貓也是動物中的一種,也可以把貓稱為動物 動物 y new 貓 動物是貓和狗具體事物中抽取出來的父型別。父型別引用指向了子類物件。多型性簡單說就是乙個物件對應著不同型別。體現 父類或者...