ããªãã®çè«
æåŸã®éšåã§ã¯ãèšèšãäžååãªã³ãŒãã§æ··ä¹±ããããšãéåžžã«ç°¡åã§ããããšã確èªããŸããã 幞ããªããšã«ãå€ä»£ãããåå²çµ±æ²»ãã®åçãç¥ãããŠããŸããããã¯ã建ç¯ã®æ§ç¯ã倧èŠæš¡ã·ã¹ãã ã®èšèšã«åºã䜿çšãããŠããŸãã ã³ã³ããŒãã³ããžã®åé¢ãã¢ãžã¥ãŒã«éã®äŸåé¢ä¿ã®åæžãçžäºäœçšã€ã³ã¿ãŒãã§ãŒã¹ã詳现ããã®æœè±¡åãç¹å®ã®èšèªã®åŒ·èª¿ãªã©ããã®ååã®ããŸããŸãªå ·äœåãç¥ã£ãŠããŸãã ããã¯åœä»€åèšèªã§ããŸãæ©èœããå®è£ ã®æ段ãç°ãªãããšãé€ããŠãé¢æ°åèšèªã§æ©èœãããšæ³å®ããå¿ èŠããããŸãã ã©ãïŒ
Inversion of Controlã®åçãèããŠã¿ãŠãã ããïŒãã®åçã®è©³çŽ°ãªèª¬æã¯ããããã¯ãŒã¯ã§ç°¡åã«èŠã€ããããšãã§ããŸãïŒããšãã°ã ãããšãã ïŒïŒã å®è¡ã®æµããéã«ããããšã«ãããããã°ã©ã ã®éšåéã®æ¥ç¶æ§ãæžããã®ã«åœ¹ç«ã¡ãŸãã æåéããããã¯ã³ãŒããå¥ã®å Žæã«åã蟌ãŸãããã€ãããã«åŒã³åºãããããšãæå³ããŸãã ãã®å Žåãåã蟌ãŸããã³ãŒãã¯ãæœè±¡ã€ã³ã¿ãŒãã§ãŒã¹ãåãããã©ãã¯ããã¯ã¹ãšèŠãªãããŸãã ã©ã®ãããªæ©èœçãªã³ãŒãã§ããIoCå±æ§ã®äž¡æ¹ãçµã¿åããããŠããããšã瀺ããŸãããããã³ãŒãã€ã³ãžã§ã¯ã·ã§ã³ããšããã©ãã¯ããã¯ã¹ãã§ãããã®ããã«ãç°¡åãªäŸãèããŸãã
é²è¡op = å埩 ïŒ `op` 2 ïŒ
geometricProgression ã arithmeticalProgression :: æŽæ° -> [ æŽæ° ]
geometricProgression =é²è¡ïŒ * ïŒ
ç®è¡é²è¡=é²è¡ïŒ + ïŒ
幟äœåŠãç®è¡:: [ æŽæ° ]
幟äœåŠ= 10 $ geometricProgression 1ãåã
ç®è¡= 10 $ã®ç®è¡é²è¡1ãåã
ããã§ã¯ãä»ã®é¢æ°ïŒïŒ*ïŒãïŒ+ïŒã `op` 2ïŒã1ã€ã®é¢æ°ã®å ¥åïŒå埩ãé²è¡ïŒã«è»¢éãããŸããã€ãŸããããã€ãã®ã³ãŒããå°å ¥ãããŠããŸãã ãŸããåä¿¡é¢æ°å ã§ã¯ããã®ã³ãŒãã¯ãã©ãã¯ããã¯ã¹ãšèŠãªãããã¿ã€ãã®ã¿ãããã£ãŠããŸãã ããšãã°ãå埩ã®å Žåã2çªç®ã®åŒæ°ã¯Integer-> Integeråã§ãªããã°ãªãããããã€ã¹ãã©ãã»ã©è€éã§ãã£ãŠãããŸããŸããã ãããã£ãŠãå¶åŸ¡ã®å転ã¯é¢æ°åããã°ã©ãã³ã°ã®åºç€ã§ãã çè«çã«ã¯ãé«éé¢æ°ã䜿çšãããšãä»»æã®å€§èŠæš¡ãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸãã åé¡ã1ã€ã ããããŸãããã®IoCã®è§£éã¯ããŸãã«ãçŽ æŽã§ãããããã¯ãã¡ããçŽ æŽãªã³ãŒãã«ã€ãªãããŸãã ãã§ã«äžèšã®äŸã§ã¯ãã³ãŒãã¯ã¢ããªã·ãã¯ãã©ãããã§ãããå®éã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯å·šå€§ãªæ¯çã«ãªããå®å šã«ãµããŒããããªããªãããšãããããŸãã
IoCãå察åŽãã€ãŸãããããŠãªããã®ã¯ã©ã€ã¢ã³ãã³ãŒãããèŠãŠã¿ãŸãããã ãã®äžã«ãç¹å®ã®ç®çã«åœ¹ç«ã€äœããã®å€éšææç©ãååŸããŸãã å€éšã§ã¯ããã®ã¢ãŒãã£ãã¡ã¯ãã¯å¥ã®ãã®ã«çœ®ãæããããšãã§ããŸãããåä¿¡åŽã®å Žåã眮æã¯ç®ã«èŠããªãã¯ãã§ãã ããã¯ãããããLisk眮æã®ååã§ãã OOPã®äžçã®ã¬ã€ããšããŠæ©èœããã¢ãŒãã£ãã¡ã¯ãã«ã¯äºæž¬å¯èœãªåäœãããããšãèŠå®ããŠããŸãã OOPèšèªã§ãã®ãããªä¿èšŒãäžããããšã¯äžå¯èœã§ããããããèŠå®ãã§ã¯ãªããä¿èšŒãã§ã¯ãªããååã«éåããã¢ãŒãã£ãã¡ã¯ãã«å¯äœçšãçªç¶çŸããå¯èœæ§ããããŸãã ãã®ååã¯é¢æ°åèšèªã«é©çšã§ããŸããïŒ ã¯ãããã¡ããã§ãã ããã«ãã³ãŒããã¯ãªãŒã³ã§ããã°ãç¹ã«èšèªãå³å¯ã«éçåä»ããããŠããå Žåããã匷åãªä¿èšŒãåŸãããŸãã
èšäºã®æåŸã«ãHaskellã®Inversion of Controlã®ããŸããŸãªå®è£ ã®ç°¡åãªèª¬æããããŸãã äžéšã®ãã³ãã¬ãŒãã¯ãåœä»€åã®äžçã®ãã³ãã¬ãŒããšã»ãŒå®å šã«é¡äŒŒããŠããŸãïŒããšãã°ãã¢ããç¶æ ã®æ³šå ¥ã¯äŸåæ§æ³šå ¥ã§ãïŒããäžéšã¯IoCã«ãããã«äŒŒãŠããŸãã ãããããããã¯ãã¹ãŠè¯ãèšèšã®ããã«çããæçšã§ãã
ããããã®ç·Žç¿
è¯ãã³ãŒããæžãæãæ¥ãŸããã ãã®èšäºã§ã¯ã ãããšãã®ã³ãããã«ãã£ãŠæŠèª¬ãããæä»£å šäœã§ããã²ãŒã ãã¢ã¡ãŒãã®äžçãã®ãã¶ã€ã³ãåŒãç¶ãæ€èšããŸãã æ代ã¯é£œåããã å®å šã«æžãçŽãããã²ãŒã ããžãã¯ã«å ããŠã ã¬ã³ãºãªã©ã®ããŒã«ãè©Šããã QuickCheckã䜿çšãããã¹ããå°å ¥ãã ãã¹ã¯ãªããèšèªãçºæããããã®ã€ã³ã¿ãŒããªã¿ãŒãäœæãããäžçã°ã©ããæ€çŽ¢ããããã®A *ã¢ã«ãŽãªãºã ãçµ±åãããå¥ã®ç¹å®ã®ã¢ã³ããã¿ãŒã³ãçºèŠããããã®æ代ãçµãããŸããã ãã®èšäºã§ã¯ãäŒè©±ã¯ããããã£ãšã·ããªãªã®ã¿ã«é¢ä¿ããæ®ãã¯æ¬¡ã®éšåã«æ®ããŸãã
ããããã£ãšãªããžã§ã¯ã
éå»ã®çµéšããããªããžã§ã¯ããå®éã«äœã§ããããããããäœã§æ§æãããŠããããæããã«ãªããŸããã ãã®èšèšã®èåŸã«ããäž»ãªã¢ã€ãã¢ã¯æ¬¡ã®ãšããã§ãããªããžã§ã¯ãã¯ãããã€ãã®ããããã£ã§æ§æããããšã³ãã£ãã£ã§ãã ãKaryonãããPlasmaãããBorderããªã©ã®ãªããžã§ã¯ããåæããã次ã®ããããã£ã»ãããååŸãããŸããã
- äžæã®èå¥å
- 圹è·
- èä¹ æ§ïŒæ倧ããã³çŸåšã®HPïŒ
- ææè ïŒãã¬ãŒã€ãŒïŒ
- ã¬ã€ã€ãŒïŒãã³ãžã§ã³ãå°çã空ïŒ
- å ŽæïŒå°å³äžïŒ
- 幎霢ïŒæ倧ããã³çŸåšã®å¹Žéœ¢ïŒ
- ããããªãŒïŒæ倧ããã³çŸåšã®ãšãã«ã®ãŒéïŒ
- 移åã®çŠæ¢ïŒãã®ã»ã«ã®ç¹å®ã®ã¬ã€ã€ãŒäžïŒ
- æ¹å
- ã ãŒãã¡ã³ã
- ãã¡ã¯ããªãŒïŒä»ã®ãªããžã§ã¯ããäœæããæ©èœïŒ
- èªå·±ç Žå£
- è¡çªïŒä»ã®ãªããžã§ã¯ããšïŒ
现å¿ã®æ³šæãæã£ãèªè ã¯ããã§äžå®å šæ§ãèŠãããšãã§ããŸããããšãã°ãäœããã®çç±ã§ãå±€ããšãå Žæãã¯2ã€ã®ããããã£ã«åãããŠããŸããããããã¯ã»ãŒåãããã«èŠããŸãã ãããŠããã®ãè¡çªããšã¯ã©ã®ãããªè²¡ç£ã§ããïŒ å·¥å Žã¯ã©ãã§ããïŒ ãããŠãã幎霢ããšãèªå·±ç Žå£ãã¯ã©ãã§ããïŒ ãããŠããªãåãªããžã§ã¯ãã¯ã¡ã¢ãªã浪費ããæåååãæã£ãŠããŸããïŒ äž»åŒµã¯æ£åœåããããã§ã«æ¬¡ã®æ代ã«ããªã¹ãã¯åã³æ¹èšãããåãããã«ïŒããããã£ã®ããããã£ã匷調衚瀺ããããšã«ãã£ãŠã ãã®çµæãæãéèŠãªãã©ã³ã¿ã€ã ããšãéçãã®6ã€ã ããæ®ããæ®ãã¯è«ççã«å€éšã®å¹æãšã¢ã¯ã·ã§ã³ã«å€ãããŸãã...
ããšãã°ãã²ãŒã ãããäžã«ååšããå¯èœæ§ã®ããããã€ãã®å®éã®ãªããžã§ã¯ããå£é ã§èª¬æããŸãã
ã«ãŒãã«ïŒ
åå= ãKaryonã
ãã±ãŒã·ã§ã³= ïŒ 1ã1ã1 ïŒ
ã¬ã€ã€ãŒ=å°ç
ææè =ãã¬ãŒã€ãŒ1
匷床= 100/100
ããããªãŒ= 300/2000
å·¥å Ž=ãã©ãºãããã¬ã€ã€ãŒ1
ãã©ãºãïŒ
åå= ããã©ãºãã
ãã±ãŒã·ã§ã³= ïŒ 2ã1ã1 ïŒ
ã¬ã€ã€ãŒ=å°ç
ææè =ãã¬ãŒã€ãŒ1
匷床= 30/40
ããããã£ã®æ°ã«ã¯éãããããããããããã«ã©ãããŒåãäœæãããããããã¹ãŠ1ã€ã®ä»£æ°åïŒ code ïŒã®äžã«é 眮ããããšã«ããŸããã
-Object.hsïŒ
dataããããã£= PNamed Named
| PDurability ïŒãªãœãŒã¹ã®èä¹ æ§ïŒ
| PBattery ïŒãªãœãŒã¹ãšãã«ã®ãŒïŒ
| æææš©ãã¬ãŒã€ãŒ
| ãã¬ã€ã¬ã€ã€ãŒ
...
å°åº ïŒ Show ã Read ã Eq ïŒ
æœè±¡ãªããžã§ã¯ãã®ã¿ã€ããå®çŸ©ããŸãã
-Object.hsïŒ
ã¿ã€ã PropertyKey = Int
PropertyMap = Mãšå ¥åããŸãã Map PropertyKeyããããã£
ããŒã¿ãªããžã§ã¯ã=ãªããžã§ã¯ã{ propertyMap :: PropertyMap }
å°åº ïŒ Show ã Read ã Eq ïŒ
財ç£ã®åœ¢ã§ç©firstãããæåã®èãã¯ãç§ãã¡ãå§ãããšãããã€ãŸãç¥ã®ADTåé¡ã«æ»ã£ããšããããšã§ãïŒåœæã¯ããã¯ã¢ã€ãã ã¿ã€ãã§ããïŒã ããããããã¯ããã§ã¯ãããŸããã 倧ããªéãã¯ãObjectåãæäŸããæœè±¡åã¬ãã«ã§ãã ãçµã¿åããã®èªç±ããšåŒã¶ããšãã§ãããã®ããããŸããå°æ°ã®ããããã£ã¯ãæ°ãããªããžã§ã¯ããé 眮ããå¯èœæ§ã®çµã¿åããã®ççºããããããŸãã ä»ã®ããããã£ã¯èšç»ãããŠããŸãã-衚瀺ãããå Žåãããããéãæ³¢ã®ããã«ãå€æŽã¯ã³ãŒãã«æ²¿ã£ãŠäŒæããŸããã ã·ããªãªã«ã€ããŠèª¬æãããšããããã確信ããŸãããä»ã®ãšããã¯ããããã®éåžžã«å ·äœçãªãªããžã§ã¯ããäœæããæ¹æ³ãèªåããŸãã
æãç°¡åãªæ¹æ³ã¯ãããããã£ã®ãªã¹ãã«å ¥åããŠData.Mapã«å€æããããšã§ã ã
-Objects.hsïŒ
ã€ã³ããŒããªããžã§ã¯ã
karyon =ãªããžã§ã¯ã$ M fromList [ ïŒ 1 ã PObjectId 1 ïŒ
ã ïŒ 4 ã PNamedâ Karyonâ ïŒ
ã ïŒ 2 ã PDurability ïŒãªãœãŒã¹100 100 ïŒ ïŒ
ã ïŒ 3 ã PBattery ïŒãªãœãŒã¹300 2000 ïŒ ïŒ
ã ïŒ 10 ã POwnership Player1 ïŒ
ã ïŒ 5 ã PDislocation ïŒ Point 1 1 1 ïŒ ïŒ
ã ... ]
...ããããåæ¢ïŒ PObjectIdãDislocationãããã³Ownershipãã©ã®ãããªããžãã¯ã§èŠå®ããŸããïŒ çµå±ã®ãšããããããäžã®ãªããžã§ã¯ãã«ã€ããŠã®ã¿ãããã«ã€ããŠè©±ãããšã¯çã«ããªã£ãŠããŸãïŒ äžæ¹ããªããžã§ã¯ãã®ã¯ã©ã¹ãæå®ããŠå€æŽããªãå ±éããããã£ããããŸããPNamedãšPLayerãPFabricãšPPassRestrictionïŒç§»åçŠæ¢ïŒã§ãã Karyonã§ã¯ãã¬ã€ã€ãŒã¯Groundã®ã¿ã§ãããPNamedâ Plasmaâããããã£ã¯ãããããã©ãºãã«ã®ã¿å±ããããšãã§ããŸãã ããã§ã¯ããããäžã«çŽæ¥é 眮ãããšãã«ãªããžã§ã¯ããäœæããå¿ èŠããããšããåé¡ã«çŽé¢ããŠããŸãããåæã«åæããŒã¿ãå«ããã³ãã¬ãŒããå¿ èŠã§ãã ãã³ãã¬ãŒããšããŠãããããã ã¹ããŒãã³ã³ã¹ãã©ã¯ã¿ãŒ ããé©ããŠããŸããæ¢è£œã®ãã¿ãŒã³ãšå°ããªå ¥åãã©ã¡ãŒã¿ãŒã»ããã«åŸã£ãŠãæ¢è£œã®ãªããžã§ã¯ããäœæããé¢æ°ã§ãã ããã¹ããŒããªã«ãªãªã³é¢æ°ã¯æ¬¡ã®ããã«ãªããŸãã
-Objects.hsïŒ
ã€ã³ããŒããªããžã§ã¯ã
karyon pId player point = Object $ M fromList [ ïŒ 1 ã PObjectId pId ïŒ
ã ïŒ 4 ã PNamedâ Karyonâ ïŒ
ã ïŒ 2 ã PDurability ïŒãªãœãŒã¹100 100 ïŒ ïŒ
ã ïŒ 3 ã PBattery ïŒãªãœãŒã¹300 2000 ïŒ ïŒ
ã ïŒ 10 ãæææš©ãã¬ã€ã€ãŒïŒ
ã ïŒ 5 ã PDislocationãã€ã³ãïŒ
ã ... ]
ãã®æ§æã¯ãšã¬ã¬ã³ããšã¯èšãé£ããããã€ãºããšèº«äœã®åããå€ãããŸãã Haskellã¯ç°¡æœãªèšèªã§ãããã·ã³ãã«ããšæ©èœçãªããããªãºã ãç®æããŠåªåããã°ãã³ãŒãã¯ããçŸãããç解ããããããã䟿å©ã«ãªããŸãã ãããäžèšã®ããã€ãã®ãã©ã°ã©ãã§æ瀺ããããã³ãã¬ãŒãã®å£é ã§ã®èª¬æãã³ãŒãã«è»¢éã§ããã°ãããšæããŸã... äžå¯èœã¯ãããŸãã ïŒ
-Objects.hs
plasmaFabric ::ãã¬ãŒã€ãŒ->ãã€ã³ã->ãã¡ããªãã¯
plasmaFabric pl p = makeObject $ do
energyCost ã= 1
ã¹ããŒã ã=ãã©ãºãpl p
ãããã¥ãŒã¹ã= True
placementAlg ã= placeToNearestEmptyCell
karyon ::ãã¬ãŒã€ãŒ->ãã€ã³ã->ãªããžã§ã¯ã
karyon pl p = makeObject $ do
namedA | = karyonName
layerA | =ã°ã©ãŠã³ã
dislocationA | = p
batteryA | = ïŒ 300 ãã¡ããã©2000 ïŒ
èä¹ æ§A | = ïŒ 100 ãã¡ããã©100 ïŒ
ownerA | = pl
fabricA | = plasmaFabric pl p
ã³ãŒãã®ããããããã¯ãèªè ã®ç¥èãšæèãèè ã®ç¥èãšæèãšã©ãã ãäžèŽããŠãããã«äŸåããŸãã ãã®ã³ãŒãã¯æ確ã§ããïŒ åœŒãäœãããŠããã®ãã¯æããã§ããã圌ã¯ã©ã®ããã«åããŠããŸããïŒ ããšãã°ãæŒç®åãã=ããšã| =ãã¯ã©ãããæå³ã§ããïŒ makeObjecté¢æ°ã¯ã©ã®ããã«æ©èœããŸããïŒ ãªãäžéšã®ååã«ã¯æåãAãããããäžéšã®ååã«ã¯ãªãã®ã§ããïŒ ãããŠãããã¯ã¢ãããäœãã§ããïŒ..
ãããã®æ£ãã質åã«å¯Ÿããé§ã®çãã¯ããã§ãããã®ã³ãŒãã¯ãªããžã§ã¯ãã®ã¬ã€ã¢ãŠãã«å éšèšèªã䜿çšããŸãã ãã®èšèšã¯ãç¶æ ã¢ãããšçµã¿åãããã¬ã³ãºã®äœ¿çšã«åºã¥ããŠããŸãã ãAãæ¥å°ŸèŸãæã€é¢æ°ã¯ãããããã£èªäœã®ã¹ããŒãã³ã³ã¹ãã©ã¯ã¿ãŒïŒãã¢ã¯ã»ãµãïŒã§ãããç¹å®ã®ããããã£ã®ã·ãªã¢ã«çªå·ãšå€ã®æ€èšŒæ¹æ³ãç¥ã£ãŠããŸãã ãAãã®ãªãæ©èœã¯ã¬ã³ãºã§ãã æŒç®åãã=ãã¯ã¬ã³ãºã®ã©ã€ãã©ãªã«å±ããStateã¢ããå ã§ãæ¡å€§äžãã®å€ãèšå®ã§ããŸãã plasmaFabricé¢æ°ã¯Fabric ADTã«å ¥åããkaryoné¢æ°ã¯PropertyMapãšObjectã«å ¥åããŸãã 2çªç®ã®äŸã§ã¯ãã¢ã¯ã»ãµãŒãšããŒã¿ã¯ã«ã¹ã¿ã æŒç®å| =ã«è»¢éãããŸããæ£ç¢ºãæãããã«ãããããå å¡«æŒç®åããšåŒã³ãŸãã fillã¹ããŒãã¡ã³ãã¯ãStateã¢ããå ã§æ©èœããŸãã 圌ã¯çŸåšã®PropertyMapãåŒãåºããã¢ã¯ã»ãµãŒã«ãã£ãŠæ€èšŒãããããããã£ããã®äžã«å ¥ããŸãã
-Object.hsïŒ
makeObject ::ããã©ã«ãa =>ç¶æ a ïŒ ïŒ -> a
makeObject = flip execState def
data PAccessor a = PAccessor { key :: PropertyKey
ã constr :: a- >ããããã£}
-ãªãã¬ãŒã¿ãŒå å¡«ããããã£ïŒ
ïŒ | = ïŒã¢ã¯ã»ãµv = do
å°éå ·< -get
let oldPropMap = _ propertyMap props
let newPropMap = insertProperty ïŒ key accessor ïŒ ïŒ constr accessor v ïŒ oldPropMap
put $ props { _ propertyMap = newPropMap }
-Namedããããã£ã®ã¢ã¯ã»ãµïŒ
isNamedValid ïŒ Named n ïŒ = not ã null $ n
namedValidator n | isNamedValid n = n
| ãã以å€ã®å Žå = ãšã©ãŒ $ "ç¡å¹ãªååä»ãããããã£ïŒ" ++ nã衚瀺
namedA = PAccessor 0 $ PNamed ã namedValidator
ãã®ãã¶ã€ã³ã¯å®ç§ã§ã¯ãããŸããã å®è¡æã«ãšã©ãŒãçºçããå¯èœæ§ããããããããããã£ã®æ€èšŒã¯éåžžã«å±éºã«èŠããŸãã ãŸããã»ããã«ãã®ãããªããããã£ãæ¢ã«ååšãããã©ãããç£èŠããŸããããã®äžã«æ°ããããããã£ãæžã蟌ãã ãã§ãã äž¡æ¹ã®æ¬ é¥ã¯ãEtherããã³Stateã¢ããã®ã¹ã¿ãã¯ãäœæããå®å šãªæ¹æ³ã§äŸå€ãåŠçããããšã§ç°¡åã«ä¿®æ£ã§ããŸãã ãã®å Žåããã³ãã¬ãŒãïŒObjects.hsïŒãå«ãã¢ãžã¥ãŒã«ã®ã³ãŒãã¯ãããã«å€æŽãããŸãã å€ãã®å©ç¹ããããŸããã1ã€ã®ç°è«ããããŸãããªããžã§ã¯ãã¬ã€ã¢ãŠãã®èšèªã¯ãã³ãã¬ãŒãã®äœæã«ã®ã¿äœ¿çšããããã¹ãã¯å¯èœã§ãããè¿œå ã®ããžãã¯ã¯éªéã«ãªããŸãã äžæ¹ããã®ã³ãŒããã¹ã¯ãªããã£ã³ã°ã«å ¥ããšãã»ãã¥ãªãã£ãéèŠã«ãªããŸãã
ãªããžã§ã¯ãã«é¢ããæåŸã®è³ªåã¯ãWorldããŒã¿åã¯ä»ã©ã®ããã«èŠããããšããããšã§ãã 倧ããªå€æŽã¯ãããŸããã§ããããäžçã¯äŸç¶ãšããŠäžçš®ã®ãããã§ãã
World = Mãšå ¥åããŸãã ããããã€ã³ããªããžã§ã¯ã
Data.Mapæ§é ã¯ããã©ãŒãã³ã¹ãäœäžããŸãã ããã§ããé©åãªãœãªã¥ãŒã·ã§ã³ã¯ã2次å é åã§ãã Haskellã«ã¯ã vectorãrepaãªã©ã®å¹ççãªãã¯ã¿ãŒå®è£ ããããŸãã ã²ãŒã ã®ããã©ãŒãã³ã¹ãååã«é«ããªãããšãæããã«ãªã£ãå Žåãäžçã®ãªããžããªã«æ»ã£ãŠç¢ºèªããããšãå¯èœã«ãªããŸãããçŸæç¹ã§ã¯éçºé床ãããéèŠã§ãã
ã·ããªãª
ã·ããªãªã¯äžçã®æ³åã§ãã ã·ããªãªã¯ç¹å®ã®çŸè±¡ã説æããŸãã äžçã®çŸè±¡ã¯å±æçã§ãã 1ã€ã®çŸè±¡ã§ã¯ãå¿ èŠãªããããã£ã®ã¿ããããã®ç¹å®ã®ã»ã¯ã·ã§ã³ã«å«ãŸããŸãã ããšãã°ãç匟ãççºãããšããååŸNã®ãªããžã§ã¯ãã®åŒ·åºŠã«é¢å¿ããããŸããããã¯ããã¡ãŒãžã®éã ãæžããå¿ èŠãããã匷床ã0æªæºã«äœäžããå Žåãããããããªããžã§ã¯ããåé€ããå¿ èŠããããŸãã å·¥å Žãåœç€Ÿã®ããã«æ©èœããå Žåãæåã«å·¥å Žã«ãªãœãŒã¹ãæäŸãã次ã«è£œåãå ¥æããŠè¿ãã®ã©ããã«é 眮ããå¿ èŠããããŸãã 匷床ã¯éèŠã§ã¯ãããŸãããããªãœãŒã¹ãå·¥å Žèªäœã補åã®ç©ºãã¹ããŒã¹ãéèŠã§ãã
ã¹ã¯ãªããã¯ãåºç€ãšãªãããããã£ã«é¢é£ããŠå®è¡ããå¿ èŠããããŸãã ãããã«ãã¢ãŒã·ã§ã³ãããããã£ãæã€ãªããžã§ã¯ããããå Žåãã¢ãŒã·ã§ã³ã¹ã¯ãªãããå®è¡ããŸãã å·¥å Žã皌åããŠããå Žåãè»äºãŠãããã®çç£ã·ããªãªãå®è¡ããŸãã ã¹ã¯ãªããã¯ãçŸåšã®äžçãå€ããããšã¯ã§ããŸããã äžåºŠã«1ã€ãã€æ©èœããçµæãããŒã¿æ§é å šäœã«èç©ããŸãã äžéšã®ã·ããªãªã®äœæ¥ã¯ãå®å šã«ãã£ã³ã»ã«ããããŸã§ãä»ã®ã·ããªãªã®äœæ¥ã«åœ±é¿ããå Žåãããããšã«çæããå¿ èŠããããŸãã
ãããäŸã§èª¬æããŸãã 1ãŠãããã®ã³ã¹ãã§1ã€ã®ã¿ã³ã¯ãçç£ãã2ã€ã®å·¥å ŽãèããŠã¿ãŸãããã åšåº«ã®ãªãœãŒã¹ã¯1ãŠãããã®ã¿ã§ãã æåã®ã·ããªãªã¯æ£åžžã«æ©èœããŸããã2çªç®ã®ã·ããªãªã§ã¯ãã¹ãŠã®ãªãœãŒã¹ã䜿ãæããããæ©èœãåæ¢ããããšãããããŸãã ãŸãã¯å¥ã®ç¶æ³ïŒ2ã€ã®ãªããžã§ã¯ããå察æ¹åã«ç§»åããŸãã ãããã®éã«1ã€ã®ã»ã«ãæ®ã£ãŠããå Žåãã©ããªããŸããïŒ è¡çªãŸãã¯ãªããžã§ã¯ãã®ããããã®åãã®äžå¯èœæ§ïŒ ãã®ãããªãã¥ã¢ã³ã¹ã¯ãããããããããããŸããã ã¹ã¯ãªãããå®æããããã®ã§ãããèªã¿åããšæžã蟌ã¿ã¯éåžžã«ç°¡åãªãŸãŸã§ãã
ã¹ã¯ãªãããµãã·ã¹ãã ã®èŠä»¶ã®æŠèŠã説æããŸãã
- ä¿¡é Œæ§;
- ããããã£ã®åãã
- ã·ãŒã±ã³ã¹;
- ã·ã³ãã«ã;
- ã¹ã¯ãªããã¯å€±æããå¯èœæ§ããããŸãã
- ããã©ãŒãã³ã¹;
- ã¹ã¯ãªããã¯ä»ã®ã¹ã¯ãªãããå®è¡ã§ããŸãã
- ...
ã²ãŒã ãThe Amoeba Worldãã§ã¯ãã·ããªãªDSLèšèªãèšèšããããã®ã€ã³ã¿ãŒããªã¿ãŒïŒã³ãŒãïŒãäœæãããŸããã Fabricããããã£ïŒã³ãŒãïŒã®ã¹ã¯ãªããã¯æ¬¡ã®ããã«ãªããŸãã
-Scenario.hsïŒ
createProduct ::ãšãã«ã®ãŒ->ãªããžã§ã¯ã->è©äŸ¡ãªããžã§ã¯ã
createProduct eCost sch = do
pl <-æææš©ã®èªã¿åã
d <-転äœã®èªã¿åã
withdrawEnergy pl eCost
return $ adjust sch [æææš©ããpl ã転äœããd ]
placeProduct prod plAlg = do
l < -withDefault ground $ getProperty layer prod
obj < -getActedObject
p < -evaluatePlacementAlg plAlg l obj
$ objectDislocationãä¿åããŸãããp $ prod
ãçæããf = do
prodObj < -createProduct ïŒ f ^ ãenergyCost ïŒ ïŒ f ^ ãscheme ïŒ
placeProduct prodObj ïŒ f ^ ãplacementAlg ïŒ
ãæ£åžžã«äœæãããŸãããã
producerScenario ::è©äŸ¡æåå
producerScenario = do
f <-ãã¡ããªãã¯ã®èªã¿åã
f ^ã çç£
ãã®åŸ ãf ãçæãã
ãã以å€ã®å Žåã¯ã ãäžæåæ¢äžãã è¿ã ãŸãã
äžé£ã®èšäºã®ç¬¬2éšãã€ãŸããlet-functionsãã»ã¯ã·ã§ã³ã§ã¯ãã³ãŒããæ±ãã«ããç解ãã«ãããã®ã§ããããšãããããŸããã ããã§ãã³ãŒãã¯è»œãããŸã ç解ã§ããŸããããç¹å®ã®ã·ã¹ãã ããã§ã«è¡šç€ºãããŠããŸãã ãããç解ããŠã¿ãŸãããã
ã·ããªãªDSLã¯ãã²ãŒã ããŒã¿ã®ãªã¯ãšã¹ãã®èšèªãšã©ã³ã¿ã€ã ã®2ã€ã®éšåã«åãããŠããŸãã ãã¹ãŠã®äžå¿ã«ããã®ã¯Evalåã§ããEitherã¢ãããšStateã¢ããã®ã¹ã¿ãã¯ã§ãã
-Evaluation.hsïŒ
ã¿ã€ã EvalType ctx res = BothT EvalError ïŒ State ctx ïŒ res
ã¿ã€ã Eval res = EvalType EvaluationContext res
Stateå éšã¢ããã䜿çšãããšãå®è¡ã³ã³ããã¹ããä¿åããã³å€æŽã§ããŸãã çŸåšã®äžçãéçšããŒã¿ãã©ã³ãã ãžã§ãã¬ãŒã¿ãŒ-ãããã¯ãã¹ãŠæ¬¡ã®ã³ã³ããã¹ãã«ãããŸãã
data DataContext = DataContext { dataObjects ::è©äŸ¡ãªããžã§ã¯ã
ã dataObjectGraph :: Eval ïŒ NeighboursFunc- > ObjectGraph ïŒ
ã dataObjectAt :: Point- > Eval ïŒ å€å Object ïŒ }
ããŒã¿ EvaluationContext = EvaluationContext { ctxData :: DataContext
ã ctxTransactionMap :: TransactionMap
ã ctxActedObject ::ãªããžã§ã¯ããããããŸãã
ã ctxNextRndNum :: Eval Int }
ã©ã¡ãã®å€éšã¢ããã§ããå®è¡ãšã©ãŒãå®å šã«åŠçã§ããŸãã æãäžè¬çãªç¶æ³ã¯ãè¡çªãçºçããå Žåã§ãããäžéšã®ã·ããªãªã¯äœæ¥ã®éäžã§äžæããã¯ãã§ãã ã²ãŒã ã®ç¶æ ãæ£ããç¶æããã«ã¯ããã¹ãŠã®å€æŽãããŒã«ããã¯ããå¿ èŠããããŸããã¹ã¯ãªãããå¥ã®ã¹ã¯ãªããããåŒã³åºãããå Žåã¯ãäœããã®æ¹æ³ã§åé¡ã«å¯Ÿå¿ããå¿ èŠããããŸãã ãããã£ãŠãå€ãã®é¢æ°ã¯Evalåã§ãããEitherã¢ãããé ããŸãã å®éãEvalåã®é¢æ°ã¯ãã¹ãŠã¹ã¯ãªããã§ãã ã€ã³ã¿ããªã¿é¢æ°ïŒevalTransactãgetTransactionObjectsïŒããã³ã¯ãšãªèšèªé¢æ°ïŒsingleãfindïŒã§ããããã®ã¿ã€ãã§åäœããå®éã«ã¯ã¹ã¯ãªããã§ããããŸãã èšãæããã°ãã·ããªãªDSLèšèªã¯Evalåã«ãã£ãŠçµ±äžãããŠãããããã«ããã³ãŒãã®äžè²«æ§ãšã¢ããåæãå¯èœã«ãªããŸãã
Evalã¿ã€ãã®é¢æ°ã¯ã¹ã¯ãªããã§ããããããããããå®è¡ããã³ãã¹ãã§ããŸãã ã¹ã¯ãªããã®è§£éã¯ãã¢ããã¹ã¿ãã¯ã®å®è¡ã«ãããŸããã
-Evaluation.hsïŒ
ã·ããªãªã®è©äŸ¡= evalState ïŒ runEitherTã·ããªãªïŒ
å®è¡ã·ããªãª= execState ïŒ runEitherTã·ããªãªïŒ
å®è¡ã·ããªãª= runState ïŒ runEitherTã·ããªãªïŒ
ã²ãŒã ã·ããªãªã®å Žåããšã³ããªãã€ã³ãã1ã€ãããŸã-äžè¬åãããmainScenarioé¢æ°ïŒ
-Scenario.hsïŒ
mainScenario ::è©äŸ¡ïŒ ïŒ
mainScenario = do
forPropertyãã¡ããªãã¯çç£ã·ããªãª
forProperty moving movingScenario
æ»ã ïŒ ïŒ
-ã¡ã€ã³ã³ãŒãã®ã©ãã-ã²ãŒã å šäœã®1ãã£ãã¯ïŒ
stepGame gameContext = runScenario mainScenario gameContext
åæ§ã«ãåã ã®ã¹ã¯ãªãããå®è¡ãããŸããã€ãŸãããŠãããã³ãŒããšæ©èœã³ãŒãã®ãã¹ããå°å ¥ã§ããŸãã ããã§ãããšãã°ãScenarioTest.hsã¢ãžã¥ãŒã«ããã®ãããã°ã³ãŒã-å¿ èŠã«å¿ããŠãæ¬æ ŒçãªQuickCheckãŸãã¯HUnitãã¹ãã«å€æã§ããŸãã
ã¡ã€ã³= è¡ã
let ctx = testContext $ initialGame 1
let result = execute ïŒ placeProduct ïŒ plasma player1 point1 ïŒ nearestEmptyCell ïŒ ctx
å°å·çµæ
ã·ããªãªDSLã©ã³ã¿ã€ã ã®æ©èœã®ããã€ãã«ç²Ÿéããã®ã§ã次ã®æ©èœãæºåããŠããŸãã
withdrawEnergy pl cnt = do
obj < -singleActual $ named `is` karyonNameãïŒãownership` is` plãïŒãbatteryCharge` suchThat` ïŒ > = cnt ïŒ
batRes < -getProperty battery obj
save $ batteryChargeããmodifyResourceStock batRes cnt $ obj
ããã¯ãç¹å®ã®ç®çã«åœ¹ç«ã€ã·ããªãªã§ããããŸãããã¬ãŒã€ãŒplã®å Žåãã³ã¢ããcntãšãã«ã®ãŒãé€å»ããŸãã ããã«ã¯äœãå¿ èŠã§ããïŒ ãŸãããããäžã§æ¬¡ã®ããããã£ãæã€ãªããžã§ã¯ããèŠã€ããŸãïŒNamed ==â Karyonâ and Ownership == plã äžèšã®ã³ãŒãã§ã¯ãsingleActualã®åŒã³åºãã確èªããŸãããã®é¢æ°ã¯ãè¿°èªã«åºã¥ããŠãªããžã§ã¯ããæ€çŽ¢ããŸãã ã¯ãšãªèšèªã®ãããã§ãèšèã«ãã説æã¯ã»ãŒæ£ç¢ºã«ã³ãŒãã«å€æãããŸãã
ãisããšããååã®karyonName
ã ïŒ ãæææš© `is` pl
ã ïŒãbatteryCharge `suchThat` ïŒ > = cnt ïŒ
æŒç®åïŒãïŒãïŒã¯ãANDããæå³ããæŒç®åãisãã¯ç¹å®ã®ããããã£ã®ç䟡æ§ãå€ã«èšå®ãããšæšæž¬ããã®ã¯ç°¡åã§ãã 3çªç®ã®è¿°éšæ¡ä»¶ã¯ãããããªãŒãããããããå€ãã®ãšãã«ã®ãŒãé€å»ããã®ã«ååã«å é»ãããŠãããªããžã§ã¯ãã®ã¿ãéžæããŸãã ãã¡ããããšãã«ã®ãŒã¯çµäºããå¯èœæ§ãããããã®åŸãªããžã§ã¯ãã¯èŠã€ãããŸãã-ãã®å ŽåãEtherã¢ããã®ãã§ã€ã«ãã©ã³ããéå§ãããã¹ã¯ãªããå šäœããã£ã³ã»ã«ãããŸãã ãããããšãã«ã®ãŒãååã§ããå Žåã¯ãå€æŽãååããŠèç©ããŸãã
save $ batteryChargeããmodifyResourceStock batRes cnt $ obj
ã·ããªãªDSLã¯ã¬ã³ãºãç©æ¥µçã«äœ¿çšããŠãããããã³ãŒããå€§å¹ ã«åæžãããããšã«èšåãã䟡å€ããããŸãã ããšãã°ãç°¡æœãªïŒbatteryChargeãã10ïŒã®ä»£ããã«ããã§ãŒã³ã«æ²¿ã£ãŠèå€åŠçãªçºæãè¡ãå¿ èŠããããŸãããªããžã§ã¯ã-> PropertyMap-> PBattery->ãªãœãŒã¹->ã¹ããã¯ã®å€æŽ->ãã¹ãŠãä¿åããŸãã ã¬ã³ãºã®ã€ãã£ãªã ã¯çãããã§ããããã®ããŒã«ã¯éåžžã«äŸ¿å©ã§ãã
ã¯ãšãªèšèªã«ã¯å€ãã®äŸ¿å©ãªæ©èœããããŸãã è¿°éšïŒã¯ãšãªé¢æ°ïŒã§å€ãã®ãªããžã§ã¯ããæ€çŽ¢ã§ããåäžã®ãªããžã§ã¯ãïŒåäžé¢æ°ïŒãæ€çŽ¢ã§ããããããå€æ°ããå Žåã¯ã¹ã¯ãªããããã¡ã€ã«ããŸãã æ€çŽ¢æŠç¥ããããŸããå€ãããŒã¿ã®ã¿ãæ€çŽ¢ããããæ°ããããŒã¿ã®ã¿ãæ€çŽ¢ãããããã¹ãŠäžç·ã«æ€çŽ¢ããã¯ã©ã€ã¢ã³ãã³ãŒãã«ãããç解ãããŸãã äžè¬ã«ãã·ããªãªDSLã¯ãã®æ©èœãäžæãããªããæ¡åŒµããæ©äŒããããŸããã ãããŠãé倧ãªåé¡ã1ã€ãããããŸããã§ããããã®äžã§ãåºæ¬ã®åºç€ãå床修æ£ããå¿ èŠããããŸãããããã¯ããªããžã§ã¯ãã¿ã€ãã®èšèšã§ãã ãã®åé¡ã®åå...
ã¢ã³ããã¿ãŒã³ã¬ã³ãº+ãªã
ãã¹ãŠã®åé¡ã®åå ã¯ãPropertyMapããŒã¿ã¿ã€ããšããããã£ã®ã¬ã³ãºã«ãããŸãã
ããããã£k l = propertyMap ã kã§ã ãã©ããŒã¹ l
named = property ïŒ key namedA ïŒ _ named
èä¹ æ§=ããããã£ïŒããŒã®èä¹ æ§A ïŒ _èä¹ æ§
ããããªãŒ=ããããã£ïŒããŒbatteryA ïŒ _ããããªãŒ
...
ããããã£é¢æ°ã¯ãã¹ãŠã®å Žåã§ç°ãªãã¬ã³ãºãè¿ããŸãããåçžæ€æ»ãæå¹ã«ãªã£ãŠããå Žåã¯å®è¡ã§ããŸããã ãããã£ãŠãNoMonomorphismRestrictionèšèªã®æ¡åŒµæ©èœãå«ããå¿ èŠããããŸããã æ®å¿µãªããããã®ãããåæšè«ã¯æãäºæããªãå Žæã§å£ãå§ããåé¿çãæ¢ãå¿ èŠããããŸããã ããã«æªãããšã«ã¯ãNoMonomorphismRestrictionã¢ãŒããã³ãŒãå šäœã«åºããå§ããŸããã Object.hsã¢ãžã¥ãŒã«ã®ã¬ã³ãºã䜿çšãããŠãããã¹ãŠã®å Žæã«åºçŸããã¿ã€ããã§ãã«ãŒã«çæ°ã«ææããŸããã æçµçã«ãã·ããªãªDSLã®èšèšã¯ãæå·ã®å¶éã®äžã§é¥ãå§ããããã€ãã®ããŸãè¯ããªããœãªã¥ãŒã·ã§ã³ã«è³ããŸããã
ãã®åé¡ã¯ãPropertyMapã¿ã€ããæŸæ£ããããšã§æ ¹çµ¶ã§ããŸãã ããã«ãããç¹å®ã®ãªããžã§ã¯ãã«äžèŠãªããããã£ãå«ããŠããã¹ãŠã®ããããã£ããªããžã§ã¯ãã¿ã€ãã«è¡šç€ºãããŸãã ä»ã®è§£æ±ºçããããããããŸããããèšèšã®æ¬¡ã®ããŒãžã§ã³ã§ã¯ãããå®çŸããŸããã
ããŒã¿ Object = Object {
-ããããã£ïŒ
objectId :: ObjectId- éçããããã£
ã objectType :: ObjectType- å®çŸ©æžã¿ããããã£
-ã©ã³ã¿ã€ã ããããã£ããªãœãŒã¹ïŒ
ãæææš©:: Player- ã©ã³ã¿ã€ã ããããã£...ãŸãã¯å¹æããããŸãïŒ
ãã©ã€ãããŠã³ã:: IntResource- ã©ã³ã¿ã€ã ããããã£
ãèä¹ æ§:: IntResource- ã©ã³ã¿ã€ã ããããã£
ããšãã«ã®ãŒ:: IntResource- ã©ã³ã¿ã€ã ããããã£
}
éã®è£å°ã¯ãããŸãã-æ¹èšã®çµæãä»ã®ããããã£ã¯å€éšã®å¹æãšã¢ã¯ã·ã§ã³ã«å€ãããŸããã ã·ããªãªDSLã®éçºã®ã»ãšãã©ãæšãŠãªããã°ãªããªãã£ãããèšèšã¯ããæ£ç¢ºã«ãªã£ã...
çµè«ã®ä»£ããã«
æ°ããã¹ã¯ãªãããšã³ãžã³ã¯ãããããããŸããŸãªååã«åºã¥ããŠããŸãã ç¹ã«ãå éšDSLã§ã¯ãªãå€éšDSLãäœæããäºå®ã§ããã¹ã¯ãªããã¯ãã¬ãŒã³ããã¹ããã¡ã€ã«ã§äœæã§ããŸãã çŸæç¹ã§ã¯ãèè ã¯FRPã䜿çšããããã®æé©ãªã¢ãã«ã®æ€çŽ¢ã§ãã¢ããªã±ãŒã·ã§ã³ã¬ã€ã€ãŒãšãã¥ãŒã¬ã€ã€ãŒã«åãçµãã§ããŸãã 以äžã®ç« ã§ã¯ãFRPã®èåŸã«ããèãæ¹ãšããªã¢ã¯ãã£ãããã°ã©ãã³ã°ã倧èŠæš¡ã¢ããªã±ãŒã·ã§ã³ã®ç°ãªãéšåãã©ã®ããã«çµã³ä»ãããã«ã€ããŠèª¬æããŸãã
Haskellã®å¶åŸ¡å®è£ ã®å転
å 責äºé ïŒèè ã«ã¯ããã®ã»ã¯ã·ã§ã³ã®èª¿æ»ãå®äºããæéããããŸããã§ããã ä»åŸã®èšäºã§ç¶ç¶ãããŸãã
ã¢ããç¶æ ã®æ³šå ¥
ãããäœã§ããã ïŒäŸåæ§æ³šå ¥ã
çšé ïŒã¯ã©ã€ã¢ã³ãã³ãŒãã®å€éšç¶æ ã䜿çšããæœè±¡åãããäœæ¥ã
説æ ïŒå€éšç¶æ ã¯ãStateã¢ãããä»ããŠã³ã³ããã¹ããšããŠå®è£ ãããŸãã ã¯ã©ã€ã¢ã³ãã³ãŒãã¯ããã®ã³ã³ããã¹ãã§Stateã¢ããã§å®è¡ãããŸãã ã³ã³ããã¹ãã«ã¢ã¯ã»ã¹ãããšãã¯ã©ã€ã¢ã³ãã³ãŒãã¯å€éšç¶æ ããããŒã¿ãåãåããŸãã
æ§é ïŒ
ContextããŒã¿åãå®çŸ©ããŸã-Stateã¢ããã®åœ¢åŒã§å€éšç¶æ ãå«ãŸããŸãïŒ
ããŒã¿ã³ã³ããã¹ã=ã³ã³ããã¹ã{ ctxNextId :: State Context Int }
åã蟌ã¿ã³ãŒãã®ç¹å®ã®ã€ã³ã¹ã¿ã³ã¹ãå®çŸ©ããŸãã ã³ãŒãã¯äžå®ã®çµæãçæã§ããŸãã
constantId ::ç¶æ ã³ã³ããã¹ãInt
constantId = 42ã è¿ããŸã
ãŸãã¯ãåŒã³åºãããšã«ç°ãªãçµæãçæããå ŽåããããŸãã
nextId :: Int- > State Context Int
nextId prevId = do let nId = prevId + 1
å€æŽïŒ \ ctx- > ctx { ctxNextId = nextId nId } ïŒ
nIdãè¿ã
ç¶æ ã¢ããã§ã¯ã©ã€ã¢ã³ãã³ãŒããäœæããŸãã
ã¯ã©ã€ã¢ã³ã= ãã
externalId < -get >> = ctxNextId
doStuff externalId
externalIdãè¿ããŸã
å€éšç¶æ ã®ç¹å®ã®ã€ã³ã¹ã¿ã³ã¹ãå®è£ ããŠãã¯ã©ã€ã¢ã³ãã³ãŒããå®è¡ããŸãã
print $ evalState client ïŒ Context constantId ïŒ
print $ evalState client ïŒ Context ïŒ nextId 0 ïŒ ïŒ
å®å šãªäŸ ïŒ èŠæš
ããã°ã©ã åºåã®äŸ ïŒ
é£ç¶IDïŒ
[ ïŒ 1 ã "GNVOERK" ïŒ ã ïŒ 2 ã "RIKTIG YOGLA" ïŒ ]
ã©ã³ãã IDïŒ
[ ïŒ 59 ã "GNVOERK" ïŒ ã ïŒ 64 ã "RIKTIG YOGLA" ïŒ ]
ã¢ãžã¥ãŒã«ã®æœè±¡å
å 容 ïŒãã©ãã¯ããã¯ã¹ã
䜿çšç®ç ïŒå®è¡æã®ã¢ã«ãŽãªãºã ã®å®è£ ãéžæããŸãã
説æ ïŒåãæ©èœãå®è£ ããè€æ°ã®ã¢ãžã¥ãŒã«ãæ¥ç¶ããããã¡ãµãŒãã¢ãžã¥ãŒã«ããããŸãã ç¹å®ã®ã¢ã«ãŽãªãºã ã«ããã°ãç¹å®ã®å®è£ ããã¡ãµãŒãã¢ãžã¥ãŒã«ã®ã¹ã€ããæ©èœã§éžæãããŸãã ã¯ã©ã€ã¢ã³ãã³ãŒãã§ã¯ããã¡ãµãŒãã¢ãžã¥ãŒã«ãæ¥ç¶ãããŠãããç®çã®ã¢ã«ãŽãªãºã ãã¹ã€ããæ©èœãä»ããŠäœ¿çšãããŸãã
å®å šãªäŸ ïŒ èŠæš