- 追加された行はこの色です。
- 削除された行はこの色です。
[[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 = ()