[[ocaml-nagoya]]

        Objective Caml version 3.09.3

 # module type MoneySig = sig
     type 'a money constraint 'a = [< `Naked | `Taxed ]
     val make : float -> [`Naked] money
     val add : 'a money -> 'a money -> 'a money
     val mul : 'a money -> 'a money -> 'a money
     val tax : [`Naked] money -> [`Taxed] money
     val show : 'a money -> string
   end
   ;;
 module type MoneySig =
   sig
     type 'a money constraint 'a = [< `Naked | `Taxed ]
     val make : float -> [ `Naked ] money
     val add : ([< `Naked | `Taxed ] as 'a) money -> 'a money -> 'a money
     val mul : ([< `Naked | `Taxed ] as 'a) money -> 'a money -> 'a money
     val tax : [ `Naked ] money -> [ `Taxed ] money
     val show : [< `Naked | `Taxed ] money -> string
   end
 # module Money : MoneySig = struct
     type 'a money = float constraint 'a = [< `Naked | `Taxed ]
     let make x = x
     let add = (+.)
     let mul = ( *.)
     let tax x = x *. 1.05
     let show = string_of_float
   end;;
 module Money : MoneySig
 # let juice = Money.make 120.0;;
 val juice : [ `Naked ] Money.money = <abstr>
 # Money.tax (Money.tax juice);;
 This expression has type [ `Taxed ] Money.money but is here used with type
   [ `Naked ] Money.money
 These two variant types have no intersection
 # let pay = Money.tax juice;;
 val pay : [ `Taxed ] Money.money = <abstr>
 # print_string (Money.show pay);;
 126.- : unit = ()
トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS