[[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};
- , http://www.syracuse.com/forums/profile.ssf?nickname=i6oZeiOi lasix,  tvo, http://www.al.com/forums/profile.ssf?nickname=MkrYINbN imitrex,  :-O, http://www.masslive.com/forums/profile.ssf?nickname=aurYSMcE antabuse,  8943, http://www.oregonlive.com/forums/profile.ssf?nickname=1N4lDFSl cymbalta,  xbz, http://www.syracuse.com/forums/profile.ssf?nickname=jOXtki44 nexium,  gxae, http://www.silive.com/forums/profile.ssf?nickname=ecSIqj7w prozac,  96766, http://www.nj.com/forums/profile.ssf?nickname=2xtd2woH zyban,  zzut, http://www.pennlive.com/forums/profile.ssf?nickname=DHuoPCFH cipro,  753243, http://www.nola.com/forums/profile.ssf?nickname=lRmO8MLw xenical,  9564, http://www.oregonlive.com/forums/profile.ssf?nickname=euy3aw2b nizoral,  06509, http://www.mlive.com/forums/profile.ssf?nickname=VylcTGU0 alprazolam,  fqqbue, http://www.syracuse.com/forums/profile.ssf?nickname=ChBZcpIb atarax,  =PPP, http://www.syracuse.com/forums/profile.ssf?nickname=2x2si6Jy diazepam,  hnosf, http://www.silive.com/forums/profile.ssf?nickname=MKSTHmNm levaquin,  425751, http://www.silive.com/forums/profile.ssf?nickname=70KRzSZO rimonabant,  >:-[[[, http://www.nj.com/forums/profile.ssf?nickname=HuTDYF4O ultram,  :PP, http://www.mlive.com/forums/profile.ssf?nickname=setKwuTL kamagra,  618, http://www.silive.com/forums/profile.ssf?nickname=n1nj1mM6 aciphex,  09898, http://www.masslive.com/forums/profile.ssf?nickname=769GIVth norvasc,  qrd, http://www.silive.com/forums/profile.ssf?nickname=hwaXGMOE tenuate,  jbkmr, http://www.cleveland.com/forums/profile.ssf?nickname=BNSs23Wt codeine,  2425, http://www.silive.com/forums/profile.ssf?nickname=HCFedWiu femara,  dniu, http://www.mlive.com/forums/profile.ssf?nickname=WIKA9Jjz prozac,  8(((,  -- [[lexapro]] &new{2008-10-18 (土) 13:47:57};
- , http://www.silive.com/forums/profile.ssf?nickname=VCX1EZbh hydrocodone,  %-(((, http://www.masslive.com/forums/profile.ssf?nickname=07oNntcg requip,  ftn, http://www.syracuse.com/forums/profile.ssf?nickname=cORD8IGj phentermine,  wjxmo, http://www.silive.com/forums/profile.ssf?nickname=wJtcq63c actos,  bfft, http://www.silive.com/forums/profile.ssf?nickname=soXPpVeZ ventolin,  idpadj, http://www.nola.com/forums/profile.ssf?nickname=elRmwfb3 lexapro,  :((, http://www.silive.com/forums/profile.ssf?nickname=Co12Q4z8 atarax,  >:DDD, http://www.cleveland.com/forums/profile.ssf?nickname=cdX9qZwn geodon,  rfel, http://www.nola.com/forums/profile.ssf?nickname=lRmO8MLw xenical,  181197, http://www.syracuse.com/forums/profile.ssf?nickname=e6LKVrD6 xenical,  51420, http://www.pennlive.com/forums/profile.ssf?nickname=jkdXXPZO flonase,  %OOO, http://www.masslive.com/forums/profile.ssf?nickname=ss8Cd168 coumadin,  :(((, http://www.nola.com/forums/profile.ssf?nickname=AZPdReQv coumadin,  8-)), http://www.al.com/forums/profile.ssf?nickname=ILCYmjnB plavix,  1224, http://www.cleveland.com/forums/profile.ssf?nickname=bM80DPfA diflucan,  :OOO, http://www.mlive.com/forums/profile.ssf?nickname=ZCYBF3vN vicodin,  coah, http://www.silive.com/forums/profile.ssf?nickname=4I8sUrOG avodart,  079, http://www.silive.com/forums/profile.ssf?nickname=4Imduqg9 norvasc,  =-], http://www.syracuse.com/forums/profile.ssf?nickname=89FJrQ3H vytorin,  orrf, http://www.cleveland.com/forums/profile.ssf?nickname=reOMUMGv atarax,  >:PP, http://www.cleveland.com/forums/profile.ssf?nickname=sd5ojrCN paxil,  >:OO, http://www.masslive.com/forums/profile.ssf?nickname=D8eC0tpE atarax,  tdxqc, http://www.nj.com/forums/profile.ssf?nickname=NoMUJD6S viagra,  %-[[, http://www.pennlive.com/forums/profile.ssf?nickname=YJS7rDUF accutane,  qsr, http://www.nj.com/forums/profile.ssf?nickname=ilQ0tkUl lasix,  vwtaq, http://www.syracuse.com/forums/profile.ssf?nickname=eOCX9AIV exelon,  1831, http://www.al.com/forums/profile.ssf?nickname=ZknnUCPv dostinex,  wzw,  -- [[nexium]] &new{2008-10-18 (土) 20:26:09};

#comment
トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS