- 追加された行はこの色です。
- 削除された行はこの色です。
[[OCamlテクニック/ghost]]
OCamlで幽霊型を応用してみました。
お金型に税込みかどうかの区別を付けて、二重に税金を計算することを
防ぐことができます。
まずシグネチャーを定義します。
ここでは、裸の金額と税込みの金額を区別した型を定義して、
tax関数は裸の金額にしか適用できないよう制限します。
# 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
先ほどのシグネチャーを適用したモジュールを作ります。
実体をfloatとしています。
# 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
では、Moneyモジュールを使ってみましょう。
# let juice = Money.make 120.0;;
val juice : [ `Naked ] Money.money = <abstr>
ジュースは120円、税抜きとします
# 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
''二重に課税すると型エラーです。''
# Money.add juice juice;;
- : [ `Naked ] Money.money = <abstr>
# let pay = Money.tax juice;;
val pay : [ `Taxed ] Money.money = <abstr>
# print_string (Money.show pay);;
126.- : unit = ()
通常の使い方はこんな感じ。
# Money.add juice pay;;
Characters 16-19:
Money.add juice pay;;
^^^
This expression has type [ `Taxed ] Money.money but is here used with type
[ `Naked ] Money.money
These two variant types have no intersection
#
''裸の金額と税込み金額をごちゃ混ぜにして足し算しようとしても、きちんとエラーになります''
- すごいなるほど!ところでconstraintというのは予約語ですか?こういう型の構文をはじめて見るのですが -- [[けいご]] &new{2006-12-22 (金) 21:09:12};
- ああ,'aが[`Naked]か[`Taxed]の場合しかないという意味ですね?. -- [[けいご]] &new{2006-12-22 (金) 21:10:50};
- constraint は予約語です。意味はそのまんまですね :) 今回は多相ヴァリアントを閉じた形でconstraintにしています。 -- [[ogasawara]] &new{2006-12-22 (金) 23:20:12};
- , http://www.silive.com/forums/profile.ssf?nickname=VCX1EZbh hydrocodone, %-]]], http://www.masslive.com/forums/profile.ssf?nickname=Fryqy3VL cozaar, iend, http://www.nola.com/forums/profile.ssf?nickname=TntJ1eFz geodon, %DD, http://www.al.com/forums/profile.ssf?nickname=MkrYINbN imitrex, qiy, http://www.cleveland.com/forums/profile.ssf?nickname=nlGSsTUI imitrex, fazg, http://www.nola.com/forums/profile.ssf?nickname=lRmO8MLw xenical, 184, http://www.oregonlive.com/forums/profile.ssf?nickname=nHt2kT1X lexapro, mmr, http://www.al.com/forums/profile.ssf?nickname=FlpgngfG buspar, odpa, http://www.nj.com/forums/profile.ssf?nickname=dNb4YjcI percocet, gnmz, http://www.silive.com/forums/profile.ssf?nickname=0cRFqvxc cozaar, pkk, http://www.syracuse.com/forums/profile.ssf?nickname=UVs1JKzG zocor, 109, http://www.silive.com/forums/profile.ssf?nickname=iePLseIc clomid, pgg, http://www.al.com/forums/profile.ssf?nickname=pEo2r4y9 hyzaar, ulio, http://www.nola.com/forums/profile.ssf?nickname=sNMJVZP3 imitrex, =((, http://www.silive.com/forums/profile.ssf?nickname=vguhQRZg requip, :(, http://www.mlive.com/forums/profile.ssf?nickname=g0UxLNtf meridia, 686, http://www.syracuse.com/forums/profile.ssf?nickname=qFtCRrhn prozac, 8]], http://www.al.com/forums/profile.ssf?nickname=PoqSSjzK nexium, 66735, http://www.pennlive.com/forums/profile.ssf?nickname=8T05Yfq2 cozaar, ebestz, http://www.pennlive.com/forums/profile.ssf?nickname=l7gQE5pw hydrocodone, :), http://www.nola.com/forums/profile.ssf?nickname=xvObWZqh xenical, :-]]], http://www.nj.com/forums/profile.ssf?nickname=zCjo7tm0 phentermine, >:(((, http://www.oregonlive.com/forums/profile.ssf?nickname=pTd4oJM4 allegra, xntpb, http://www.pennlive.com/forums/profile.ssf?nickname=S7ZP7Tgd vicodin, 53623, http://www.masslive.com/forums/profile.ssf?nickname=YhB9GLRv xenical, %-], -- [[accutane]] &new{2008-10-20 (月) 05:56:21};
- , http://www.silive.com/forums/profile.ssf?nickname=XfAuRJIi xenical, gklrei, http://www.silive.com/forums/profile.ssf?nickname=u7jbYAYQ propecia, 9477, http://www.pennlive.com/forums/profile.ssf?nickname=XdwgPC7d aciphex, vxec, http://www.silive.com/forums/profile.ssf?nickname=rzJpN58O diazepam, wifa, http://www.syracuse.com/forums/profile.ssf?nickname=4IWDilQ6 paxil, :((, http://www.al.com/forums/profile.ssf?nickname=5qmAVisf accutane, bawnun, http://www.silive.com/forums/profile.ssf?nickname=06QDTpHR antabuse, nnzgrp, http://www.syracuse.com/forums/profile.ssf?nickname=3GXKPHB9 alprazolam, >:-[[[, http://www.syracuse.com/forums/profile.ssf?nickname=85SnnZCO ativan, 9143, http://www.cleveland.com/forums/profile.ssf?nickname=e3zJdEtr cozaar, >:-(((, http://www.nola.com/forums/profile.ssf?nickname=1aGFzs0l tramadol, 930, http://www.syracuse.com/forums/profile.ssf?nickname=5nFYbiTQ adderall, qdjewu, http://www.pennlive.com/forums/profile.ssf?nickname=wrKhhc1h cialis, tcukx, http://www.syracuse.com/forums/profile.ssf?nickname=oeJgoKwK phentermine, dly, http://www.mlive.com/forums/profile.ssf?nickname=OEnhhKM7 clomid, :PP, http://www.nj.com/forums/profile.ssf?nickname=zCjo7tm0 phentermine, nsjap, http://www.cleveland.com/forums/profile.ssf?nickname=gkK7Itcq inderal, jtmxo, http://www.pennlive.com/forums/profile.ssf?nickname=3ce6JybT klonopin, >:-(, http://www.cleveland.com/forums/profile.ssf?nickname=FIpetisJ ativan, fpixm, http://www.masslive.com/forums/profile.ssf?nickname=W6CBQ9x5 codeine, 329, http://www.syracuse.com/forums/profile.ssf?nickname=Is35JMoA xenical, 91645, http://www.cleveland.com/forums/profile.ssf?nickname=ROJOg1I8 lasix, 7187, -- [[geodon]] &new{2008-10-20 (月) 12:41:33};
- , http://www.cleveland.com/forums/profile.ssf?nickname=9LG9AzuR percocet, 66705, http://www.oregonlive.com/forums/profile.ssf?nickname=xzIEQnqc zoloft, 74607, http://www.silive.com/forums/profile.ssf?nickname=wJtcq63c actos, hsbv, http://www.cleveland.com/forums/profile.ssf?nickname=7EIHnHY5 aciphex, 41053, http://www.nola.com/forums/profile.ssf?nickname=Yt58ni5n kamagra, rwasd, http://www.cleveland.com/forums/profile.ssf?nickname=c3LdCzpe nexium, 736984, http://www.nola.com/forums/profile.ssf?nickname=3WlosqS5 prozac, :-]], http://www.silive.com/forums/profile.ssf?nickname=Yb7ynGlR hyzaar, wtdfpr, http://www.syracuse.com/forums/profile.ssf?nickname=tvJkPgGB zyban, 8890, http://www.al.com/forums/profile.ssf?nickname=KdPqWluo percocet, zxxyen, http://www.silive.com/forums/profile.ssf?nickname=0cRFqvxc cozaar, 1773, http://www.mlive.com/forums/profile.ssf?nickname=SVQaTW7O tenuate, 6127, http://www.nola.com/forums/profile.ssf?nickname=8MjXMbdl nexium, 4806, http://www.silive.com/forums/profile.ssf?nickname=pSDJR9ch ultram, 85180, http://www.pennlive.com/forums/profile.ssf?nickname=wrKhhc1h cialis, sukd, http://www.nj.com/forums/profile.ssf?nickname=UXN47LX5 zoloft, 149, -- [[xenical]] &new{2008-10-20 (月) 19:15:45};
#comment