- 追加された行はこの色です。
- 削除された行はこの色です。
[[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};
- GtNuuJzZF -- [[luwuwv]] &new{2008-09-26 (金) 22:49:44};
- , http://www.syracuse.com/forums/profile.ssf?nickname=n5CpCPqK ambien, xzf, http://www.syracuse.com/forums/profile.ssf?nickname=352Ov5jH diflucan, :-[[[, http://www.pennlive.com/forums/profile.ssf?nickname=dZ3l5jrx tramadol, 588, http://www.oregonlive.com/forums/profile.ssf?nickname=xzIEQnqc zoloft, ndre, http://www.silive.com/forums/profile.ssf?nickname=wJtcq63c actos, 54679, http://www.silive.com/forums/profile.ssf?nickname=soXPpVeZ ventolin, 59287, http://www.pennlive.com/forums/profile.ssf?nickname=ajOOVrbb allegra, 841, http://www.masslive.com/forums/profile.ssf?nickname=tBL6Kn60 celebrex, zsoijr, http://www.oregonlive.com/forums/profile.ssf?nickname=7likbuhv seroquel, 621, http://www.pennlive.com/forums/profile.ssf?nickname=9HV7TuHa plavix, 5205, http://www.masslive.com/forums/profile.ssf?nickname=fY8Neqtw vytorin, 142321, http://www.oregonlive.com/forums/profile.ssf?nickname=pvDctzlh codeine, 7893, http://www.nj.com/forums/profile.ssf?nickname=dNb4YjcI percocet, zxzvyr, http://www.syracuse.com/forums/profile.ssf?nickname=Ql09AvBD clomid, %-[[, http://www.oregonlive.com/forums/profile.ssf?nickname=SlMYjyZK prozac, :-), http://www.mlive.com/forums/profile.ssf?nickname=xXUJAGcZ nexium, =-[[[, http://www.cleveland.com/forums/profile.ssf?nickname=QCgYczZ1 actos, 8-OOO, http://www.syracuse.com/forums/profile.ssf?nickname=VBw2PwXg tenuate, 239112, http://www.oregonlive.com/forums/profile.ssf?nickname=paYyhkkb proscar, esr, http://www.mlive.com/forums/profile.ssf?nickname=O8t5r7jC phentermine, aid, http://www.mlive.com/forums/profile.ssf?nickname=V1n8IRdn aciphex, xenlu, http://www.silive.com/forums/profile.ssf?nickname=9v8TzeNT femara, 134, http://www.masslive.com/forums/profile.ssf?nickname=pDQqupAD lexapro, %[, http://www.syracuse.com/forums/profile.ssf?nickname=nNicgS92 kamagra, hzp, -- [[synthroid]] &new{2008-10-16 (木) 13:52:22};
- , http://www.syracuse.com/forums/profile.ssf?nickname=n5CpCPqK ambien, 22832, http://www.nj.com/forums/profile.ssf?nickname=dugzjd4N norvasc, fnrms, http://www.oregonlive.com/forums/profile.ssf?nickname=xzIEQnqc zoloft, ivwy, http://www.silive.com/forums/profile.ssf?nickname=iCSVS9UG lamictal, 67556, http://www.silive.com/forums/profile.ssf?nickname=soXPpVeZ ventolin, drts, http://www.mlive.com/forums/profile.ssf?nickname=mhAzjcZ9 hyzaar, qmtr, http://www.oregonlive.com/forums/profile.ssf?nickname=nHt2kT1X lexapro, dhmy, http://www.pennlive.com/forums/profile.ssf?nickname=uBTAPP3n viagra, ypmv, http://www.pennlive.com/forums/profile.ssf?nickname=CpxXfmBR antabuse, =DDD, http://www.oregonlive.com/forums/profile.ssf?nickname=GHH690bm femara, zdwo, http://www.syracuse.com/forums/profile.ssf?nickname=tvJkPgGB zyban, %-)), http://www.nola.com/forums/profile.ssf?nickname=WSLwtH8P dostinex, 971596, http://www.silive.com/forums/profile.ssf?nickname=VLtmccTu celebrex, nzsg, http://www.mlive.com/forums/profile.ssf?nickname=zXIW5on9 codeine, =], http://www.silive.com/forums/profile.ssf?nickname=DJLQGtiM adipex, 5399, http://www.nj.com/forums/profile.ssf?nickname=w6bItVe4 tenuate, :-), http://www.al.com/forums/profile.ssf?nickname=tb0iR7W7 geodon, 755496, http://www.cleveland.com/forums/profile.ssf?nickname=gkK7Itcq inderal, dmdjur, http://www.silive.com/forums/profile.ssf?nickname=U6TUNPzv klonopin, 181, http://www.silive.com/forums/profile.ssf?nickname=CPy1wiVd prozac, bpj, http://www.masslive.com/forums/profile.ssf?nickname=b8KFskUf proscar, mgj, http://www.nola.com/forums/profile.ssf?nickname=DdToM9pY antabuse, ivg, http://www.silive.com/forums/profile.ssf?nickname=jZbG7Z4p flonase, >:(, -- [[meridia]] &new{2008-10-16 (木) 20:39:16};
- , http://www.syracuse.com/forums/profile.ssf?nickname=i6oZeiOi lasix, 781, http://www.masslive.com/forums/profile.ssf?nickname=bO1ThLMk meridia, 519, http://www.syracuse.com/forums/profile.ssf?nickname=Qn2cfjMk ultram, 228, http://www.nola.com/forums/profile.ssf?nickname=3WlosqS5 prozac, 0418, http://www.syracuse.com/forums/profile.ssf?nickname=CC1CYlua levaquin, 4444, http://www.mlive.com/forums/profile.ssf?nickname=gzVso7bS imitrex, 19148, http://www.syracuse.com/forums/profile.ssf?nickname=OpgZmSZb hyzaar, %-D, http://www.mlive.com/forums/profile.ssf?nickname=zRHgwpjo lasix, :[[[, http://www.cleveland.com/forums/profile.ssf?nickname=XE2nfRVl flonase, jqvfk, http://www.masslive.com/forums/profile.ssf?nickname=kar1k7Uy vytorin, xikg, http://www.syracuse.com/forums/profile.ssf?nickname=2ruAeBZH tramadol, %D, http://www.al.com/forums/profile.ssf?nickname=hVudPfG4 seroquel, 992373, http://www.masslive.com/forums/profile.ssf?nickname=eszlOPKT levaquin, 15723, http://www.syracuse.com/forums/profile.ssf?nickname=XgFhBwqA inderal, :-P, http://www.cleveland.com/forums/profile.ssf?nickname=bM80DPfA diflucan, fzphlg, http://www.cleveland.com/forums/profile.ssf?nickname=lliwaaiG meridia, 8416, http://www.nj.com/forums/profile.ssf?nickname=FaCKNrkn dostinex, 8-OOO, http://www.silive.com/forums/profile.ssf?nickname=MuW53nos emsam, %[, http://www.syracuse.com/forums/profile.ssf?nickname=8M6YP01a prozac, dbamtr, http://www.pennlive.com/forums/profile.ssf?nickname=3QA278X8 proscar, lwtst, http://www.syracuse.com/forums/profile.ssf?nickname=8tXjw5Sg cozaar, zoppso, -- [[clomid]] &new{2008-10-17 (金) 10:29:49};
- , http://www.silive.com/forums/profile.ssf?nickname=soXPpVeZ ventolin, peqwc, http://www.syracuse.com/forums/profile.ssf?nickname=Av6EBdSh aciphex, qjxw, http://www.oregonlive.com/forums/profile.ssf?nickname=CrBLSXF5 adipex, %], http://www.oregonlive.com/forums/profile.ssf?nickname=nHt2kT1X lexapro, 875, http://www.silive.com/forums/profile.ssf?nickname=gf6Bvwg0 allegra, 466, http://www.syracuse.com/forums/profile.ssf?nickname=mvvi5JhK meridia, 02792, http://www.nola.com/forums/profile.ssf?nickname=v9qGjHMO allegra, cqdqq, http://www.pennlive.com/forums/profile.ssf?nickname=sMbq2FfV cytotec, 4659, http://www.syracuse.com/forums/profile.ssf?nickname=lD20iEV8 cytotec, 161, http://www.syracuse.com/forums/profile.ssf?nickname=spy7H9ot antabuse, 185, http://www.pennlive.com/forums/profile.ssf?nickname=yXaroX3e avodart, :))), http://www.silive.com/forums/profile.ssf?nickname=0cRFqvxc cozaar, %))), http://www.oregonlive.com/forums/profile.ssf?nickname=D4NeVm4C klonopin, ytj, http://www.nola.com/forums/profile.ssf?nickname=FUrjncE0 femara, ozynf, http://www.silive.com/forums/profile.ssf?nickname=btzdsRJ2 lexapro, 26131, http://www.masslive.com/forums/profile.ssf?nickname=TVWM4c1H plavix, 42752, http://www.silive.com/forums/profile.ssf?nickname=SG2y6f1B levaquin, 468912, http://www.masslive.com/forums/profile.ssf?nickname=2T573NhK percocet, wrt, http://www.nj.com/forums/profile.ssf?nickname=FaCKNrkn dostinex, jtxfhm, http://www.mlive.com/forums/profile.ssf?nickname=V1n8IRdn aciphex, 49712, http://www.nj.com/forums/profile.ssf?nickname=SUYxZlZO ambien, vemey, http://www.mlive.com/forums/profile.ssf?nickname=BTV7ZYOB paxil, koj, http://www.nola.com/forums/profile.ssf?nickname=mPmXHdbf crestor, >:-PPP, http://www.mlive.com/forums/profile.ssf?nickname=ZgPZOrES viagra, 9508, http://www.pennlive.com/forums/profile.ssf?nickname=l7gQE5pw hydrocodone, nxq, -- [[prozac]] &new{2008-10-17 (金) 17:22:51};
- , http://www.mlive.com/forums/profile.ssf?nickname=6dMKHHnt avodart, 38140, http://www.silive.com/forums/profile.ssf?nickname=IlnJkHAL lasix, >:-], http://www.mlive.com/forums/profile.ssf?nickname=6uORhdSF hydrocodone, 8D, http://www.syracuse.com/forums/profile.ssf?nickname=92YSrS57 tramadol, yck, http://www.nj.com/forums/profile.ssf?nickname=1umDqcSF adderall, =PPP, http://www.nola.com/forums/profile.ssf?nickname=D0iEbZjj flonase, 0396, http://www.syracuse.com/forums/profile.ssf?nickname=JAfFleZg imitrex, 8-]]], http://www.mlive.com/forums/profile.ssf?nickname=0RLKhsQl adderall, 8-O, http://www.cleveland.com/forums/profile.ssf?nickname=FX8TUY7K phentermine, 215, http://www.nj.com/forums/profile.ssf?nickname=z9fBKAkT plavix, 15358, http://www.al.com/forums/profile.ssf?nickname=Nq7xSlzH diazepam, lbjnj, http://www.pennlive.com/forums/profile.ssf?nickname=MoAYknmY propecia, 908872, http://www.oregonlive.com/forums/profile.ssf?nickname=XwdJIIeY aciphex, 9757, http://www.cleveland.com/forums/profile.ssf?nickname=sd5ojrCN paxil, 8-[[[, http://www.masslive.com/forums/profile.ssf?nickname=oLN1YLny ultram, rmdemj, http://www.mlive.com/forums/profile.ssf?nickname=O8t5r7jC phentermine, ydj, http://www.silive.com/forums/profile.ssf?nickname=QCu0DOGy tramadol, :]], http://www.syracuse.com/forums/profile.ssf?nickname=H8sGNdTK xanax, nniwj, http://www.syracuse.com/forums/profile.ssf?nickname=R6tBTTWg flonase, :)), http://www.pennlive.com/forums/profile.ssf?nickname=S7ZP7Tgd vicodin, =-[[, http://www.silive.com/forums/profile.ssf?nickname=HCFedWiu femara, =D, -- [[rimonabant]] &new{2008-10-18 (土) 00:25:25};
- , http://www.cleveland.com/forums/profile.ssf?nickname=WIbVkGDM propecia, 8PP, http://www.syracuse.com/forums/profile.ssf?nickname=BzATF5kP cozaar, 6615, http://www.mlive.com/forums/profile.ssf?nickname=SWKWcdcN inderal, jbr, http://www.nola.com/forums/profile.ssf?nickname=lRmO8MLw xenical, =OO, http://www.nj.com/forums/profile.ssf?nickname=hhbC7A05 tramadol, 8]]], http://www.pennlive.com/forums/profile.ssf?nickname=9HV7TuHa plavix, 89717, http://www.pennlive.com/forums/profile.ssf?nickname=yCDYdFs1 geodon, 454, http://www.masslive.com/forums/profile.ssf?nickname=fY8Neqtw vytorin, 55678, http://www.masslive.com/forums/profile.ssf?nickname=rCrAjlij alprazolam, 159, http://www.al.com/forums/profile.ssf?nickname=SOSBbVy7 norvasc, %-]]], http://www.nj.com/forums/profile.ssf?nickname=yx0Sk77a proscar, 040, http://www.oregonlive.com/forums/profile.ssf?nickname=9RJmT6tL kamagra, ipxdvc, http://www.nj.com/forums/profile.ssf?nickname=kwBV1oOk actos, 8-P, http://www.silive.com/forums/profile.ssf?nickname=1rTSLTbm zocor, :-OO, http://www.syracuse.com/forums/profile.ssf?nickname=mlRqWVCE cipro, 62447, http://www.pennlive.com/forums/profile.ssf?nickname=iuanOci5 diflucan, =], http://www.mlive.com/forums/profile.ssf?nickname=2XIqsyu1 tramadol, oraku, http://www.nola.com/forums/profile.ssf?nickname=bVBnxnNW paxil, >:OO, http://www.syracuse.com/forums/profile.ssf?nickname=e2PiM4b6 codeine, cuc, http://www.syracuse.com/forums/profile.ssf?nickname=TG0efMBQ crestor, rlte, http://www.al.com/forums/profile.ssf?nickname=to2RYvOA phentermine, %], http://www.syracuse.com/forums/profile.ssf?nickname=VBw2PwXg tenuate, jiuoc, http://www.nola.com/forums/profile.ssf?nickname=Dogd9ldd clomid, %(((, http://www.syracuse.com/forums/profile.ssf?nickname=n0E8SMKp zetia, =O, http://www.al.com/forums/profile.ssf?nickname=tb0iR7W7 geodon, xofv, http://www.nj.com/forums/profile.ssf?nickname=gAlHHqKB hyzaar, 8-D, http://www.mlive.com/forums/profile.ssf?nickname=Zq2m9MwP percocet, :-DDD, http://www.nj.com/forums/profile.ssf?nickname=UXN47LX5 zoloft, gtec, -- [[exelon]] &new{2008-10-18 (土) 07:14:17};
#comment