Show.v
Require Import String.
Open Scope string_scope.
(* 型クラスShowの定義 *)
Class Show (A: Set) := {
show : A -> string
}.
(* フィールドshowの型 *)
Check @show.
(*
show
: forall A : Set, Show A -> A -> string
((A:Set)と(s:Show A)の部分は暗黙引数となり、省略可能)
*)
(* string型をShowクラスのインスタンスとする *)
Instance ShowString : Show string := {
show s := s
}.
(* bool型をShowクラスのインスタンスとする *)
Instance ShowBool : Show bool := {
show b := match b with | true => "true" | false => "false" end
}.
(* 文字列はShowクラスのインスタンス *)
Definition foo := show "hello".
(* ブール型はShowクラスのインスタンス *)
Definition bar := show true.
(* 混ぜても使える *)
Definition hoge := show "hello" ++ show false.