Previous Up Next

Chapter 7  »²¾È¡¤Îã³°½èÍý¡¤Æþ½ÐÎÏ

ËܾϤÏObjective Caml¤ËÈ÷¤ï¤Ã¤Æ¤¤¤ëÉûºîÍѤòȼ¤¦µ¡Ç½¤ò³µ´Ñ¤¹¤ë¡£ Objective Caml¥×¥í¥°¥é¥à¤Î¼Â¹Ô¤Ï¼°¤òÃͤËɾ²Á¤¹¤ë²áÄø¤Ç¤¢¤Ã¤¿¡¥ ÉûºîÍѤȤϡ¢¼°¤Îɾ²ÁÃæ¤Ëµ¯¤³¤ë¡Ö¤Ê¤Ë¤«¡×¤Ç¤¢¤ê¡¢ ÂåÆþ¡¢¥Õ¥¡¥¤¥ë¤Ø¤ÎÆþ½ÐÎϤʤɤ¬¤½¤Î°ìÎã¤Ç¤¢¤ë¡£ ÉûºîÍѤòȼ¤ï¤Ê¤¤¼°¤Ï²¿ÅÙɾ²Á¤·¤Æ¤â·ë²Ì¤ÏÉÔÊѤǤ¢¤ê¡¤¤Þ¤¿¡¤¼°¤ò¤½¤Îɾ²Á·ë²Ì¤ÎÃÍ ¤ÇÃÖ´¹¤¨¤Æ¤â¥×¥í¥°¥é¥à¤ÎµóÆ°¤ÏÊѲ½¤·¤Ê¤¤¡¥ °ìÊý¡¤ÉûºîÍѤòȼ¤¦¼°¤Ï¡¤É¾²Á¤¹¤ëÅ٤˰ã¤Ã¤¿·ë²Ì¤¬ÆÀ¤é¤ì¤ë²ÄǽÀ­¤¬¤¢¤ê¡¤ ɾ²Á·ë²Ì¤Ç¤½¤Î¼°¤òÃÖ´¹¤¨¤Æ¤·¤Þ¤¦¤È¥×¥í¥°¥é¥à¤Î µóÆ°¤¬ÊѤï¤Ã¤Æ¤·¤Þ¤¦¡£¤½¤Î¤¿¤á¡¤ÉûºîÍѤòȼ¤¦¥×¥í¥°¥é¥à¤ÎµóÆ°¤Ï¤·¤Ð¤·¤Ð¿äÏÀ ¤·¤Ë¤¯¤¯¤Ê¤ë¡£

ÉûºîÍѤòȼ¤¦´Ø¿ô¤Î°ìÎã¤Ï¡¤Ã¼Ëö¤Ø¤Îɽ¼¨¤ò¹Ô¤¦´Ø¿ô print_string ¤Ç¤¢¤ë¡¥

# print_string "Hello, World!\n";;
Hello, World!
- : unit = ()

¤³¤³¤Ç¤Ï¡¤ÉûºîÍѤȤ·¤Æ°ú¿ô¤Îʸ»úÎó¤¬É¸½à½ÐÎÏ(üËö²èÌÌ)¤Ø½ñ¤­½Ð¤µ¤ì¤Æ¤¤¤ë¡¥ ¤Þ¤¿¡¤¤³¤Î´Ø¿ô¤ÏÊÖ¤êÃͤȤ·¤Æ () ¤òÊÖ¤·¤Æ¤¤¤ë¡¥¤³¤Î¤è¤¦¤Ë¡¤ ÉûºîÍѼ«ÂΤ˰ÕÌ£¤¬¤¢¤ê·×»»·ë²Ì¤È¤·¤Æ¤Ï½ÅÍפÊÃͤòȼ¤ï¤Ê¤¤´Ø¿ô¤Ï¡¤Åµ·¿Åª¤Ë¤Ï unit·¿¤òÊÖ¤¹´Ø¿ô¤È¤·¤Æɽ¸½¤µ¤ì¤ë¡¥ (Objective Caml ¤Ç¤Ï´ðËÜŪ¤ËÁ´¤Æ¤Î¥×¥í¥°¥é¥àÃæ¤Î¼°¤Ï²¿¤é¤«¤ÎÃͤòÊÖ¤¹¡¥ Ì¿Îá·¿¸À¸ì¤Ë¤ª¤±¤ë¥³¥Þ¥ó¥É¤â¤³¤Î¤è¤¦¤Ê´Ø¿ô¤È¤·¤Æɽ¸½¤µ¤ì¤Æ¤¤¤ë¡¥)

¤Þ¤¿¡¤´Ø¿ô read_line ¤Ï¡¤°ú¿ô () ¤Ç¸Æ¤Ð¤ì¤ë¤È¡¤ üËö¤«¤é¤ÎÆþÎϤòÂÔ¤Á¡¤¤½¤Î·ë²Ì¤òʸ»úÎó¤È¤·¤ÆÊÖ¤¹¡¥

# read_line ();;
foo           ⇐ ¥­¡¼¥Ü¡¼¥É¤«¤é¤ÎÆþÎÏ
- : string = "foo"

¥­¡¼¥Ü¡¼¥É¤«¤é¤ÎÆþÎϤ¬¤«¤ï¤ëÅÙ¤ËƱ¤¸¼° read_line () ¤ÎÊÖ¤¹ÃÍ¤Ï ÊѤäƤ¤¤¯¡¥¤½¤Î¤¿¤á¡¤ÉûºîÍѤòȼ¤¦¼°¤Ë¤Ä¤¤¤Æ¤Ï¡¤¤¤¤Äɾ²Á¤µ¤ì¤ë¤«¤ò ¾ï¤ËƬ¤Ë¤¤¤ì¤Æ¥×¥í¥°¥é¥à¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥

7.1  »²¾È¡¢¹¹¿·²Äǽ¥ì¥³¡¼¥É¤ÈÇÛÎó

¤³¤³¤Þ¤Ç¸«¤¿¥×¥í¥°¥é¥à¤Ç¤Ï°ìÅÙºîÀ®¤·¤¿¥Ç¡¼¥¿¤ò¹¹¿·¤¹¤ë¼êÃʤÏÍ¿¤¨¤é¤ì¤Æ¤¤¤Ê ¤¤¡¥Objective Caml ¤Ë¤Ï¤¤¤¯¤Ä¤«¤Î¹¹¿·²Äǽ¤Ê¥Ç¡¼¥¿¹½Â¤¤¬ÍÑ°Õ¤µ¤ì¤Æ¤¤¤ë¡¥»²¾È(references)¡¤¹¹¿·²Äǽ¥ì¥³¡¼¥É(mutable records)¡¤ÇÛÎó(array)¤Ç¤¢¤ë¡¥

7.1.1  »²¾È

Objective Caml ¤Ë¤ª¤±¤ë»²¾È¤Î³µÇ°¤Ï¤Û¤Ü¥á¥â¥ê¥¢¥É¥ì¥¹¤È¹Í¤¨¤ë¤³¤È¤¬¤Ç¤­¡¤ C ¤Ë¤ª¤±¤ëÊÑ¿ô¡¤¥Ý¥¤¥ó¥¿¤Ê¤É¤ËÂбþ¤¹¤ë¡¥»²¾È¤ÎÃͤϤ½¤Î ¥¢¥É¥ì¥¹¤¬»Ø¤¹Àè¤Ë¥Ç¡¼¥¿¤ò³ÊǼ¤·¤Æ¤ª¤ê¡¤ÂåÆþÁàºî¤Ë¤è¤Ã¤Æ ¤½¤ÎÆâÍƤò½ñ¤­´¹¤¨¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥t ·¿¤ÎÃͤؤλ²¾ÈÃÍ¤Ï t ref ·¿¤¬Í¿¤¨¤é¤ì¤ë¡¥

»²¾È¤ÎÀ¸À®¤Ï ref ´Ø¿ô¤Ç¹Ô¤¦¡¥ref ´Ø¿ô¤Ï»²¾ÈÀè¤Ë³ÊǼ¤¹¤ë½é´üÃͤò °ú¿ô¤È¤·¤Æ¤È¤ê¡¤¤½¤ì¤ò³ÊǼ¤·¤¿¥¢¥É¥ì¥¹¤òÊÖ¤¹¡¥(¤¿¤À¤·¡¤¼ÂºÝ¤Î¥¢¥É¥ì¥¹¤Î ¿ôÃͤ¬´Ñ»¡¤Ç¤­¤ë¤ï¤±¤Ç¤Ï¤Ê¤¤¡¥) ¤³¤Î´Ø¿ô¤ÏÄ̾ï¤Î¿ô³ØŪ¤Ê°ÕÌ£¤Î´Ø¿ô¤È¤Ï°ã¤¤¡¤read_line ¤Î¤è¤¦¤Ë ¸Æ¤Ó½Ð¤¹Å٤˿·¤·¤¤ÃÍ(¥¢¥É¥ì¥¹)¤òÊÖ¤¹¡¥»²¾È¤«¤é³ÊǼ¤µ¤ì¤¿Ãͤò¼è½Ð¤¹¤Ë¤Ï Á°ÃÖ¥ª¥Ú¥ì¡¼¥¿ ! ¤ò»ÈÍѤ¹¤ë¡¥¤Þ¤¿¡¤ÂåÆþ¼°

⟨ ¼°1 ⟩ := ⟨ ¼°2

¤Ï⟨ ¼°1 ⟩¤òɾ²Á¤·¤¿·ë²Ì¤Î»²¾È¤Ë ⟨ ¼°2 ⟩¤Îɾ²Á·ë²Ì¤òÂåÆþ¤¹¤ë¤â¤Î¤Ç¤¢¤ë¡¥ ±¦Êդη¿¤¬ t ¤Ç¤¢¤ë¤È¤­¤Ë¤Ï¡¤º¸Êդη¿¤Ï t ref ¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥ ÂåÆþ¼°¼«ÂΤÏÂåÆþ¤È¤¤¤¦ÉûºîÍѤòµ¯¤¹¤À¤±¤Ç¡¤¤½¤Î·ë²Ì¤Ï¾ï¤Ë()¤Ç¤¢¤ë¡¥ °Ê²¼¤Ï´Êñ¤Ê»²¾È¤ò»È¤Ã¤¿Îã¤Ç¤¢¤ë¡¥

# let p = ref 5 and q = ref 2;;
val p : int ref = contents = 5
val q : int ref = contents = 2
# (!p, !q);;
- : int * int = (5, 2)
# p := !p + !q;;
- : unit = ()
# (!p, !q);;
- : int * int = (7, 2)

»²¾È¤òÍý²ò¤¹¤ë¾å¤ÇÂç»ö¤Ê¤Î¤Ï¡¤³ÊǼ¤µ¤ì¤Æ¤¤¤ëÃͤȤ½¤ì¤Î¥¢¥É¥ì¥¹¤ò¶èÊ̤¹¤ë¤³ ¤È¤Ç¤¢¤ë¡¥ÂåÆþ¼°¤Ïº¸ÊդΥ¢¥É¥ì¥¹¤ÎÆâÍƤò±¦ÊÕ¤ÎÃÍ¤Ç ½ñ¤­´¹¤¨¤ë¡¥! ¤¬É¬ÍפʤΤ⡤¤³¤Î¶èÊ̤ò¤Ï¤Ã¤­¤ê¤µ¤»¤ë¤â¤Î¤È»×¤¨¤ÐÎɤ¤¡¥ C ¤Ê¤É¤ÎÂåÆþʸ¤Ç¤Ï¡¤i = j ¤È½ñ¤¤¤¿¤È¤­¤Ë¡¤º¸ÊդϰÅÌۤΤ¦¤Á¤ËÊÑ¿ô i ¤Î ¥¢¥É¥ì¥¹¤ò¤µ¤·¡¤±¦ÊդΠj ¤ÏÊÑ¿ô j ¤ÎÆâÍƤò»Ø¤·¼¨¤·¤Æ¤¤¤ë¡¥

»²¾ÈÃͤϥǡ¼¥¿¹½Â¤¤Ë³ÊǼ¤¹¤ë¤³¤È¤â¤Ç¤­¤ë¡¥

# let reflist = [p; q; p];;
val reflist : int ref list = [contents = 7; contents = 2; contents = 7]
# p := 100;;
- : unit = ()
# reflist;;
- : int ref list = [contents = 100; contents = 2; contents = 100]

ÂåÆþÁàºî¤¬ reflist ¤Î½ÐÎÏ·ë²Ì¤ËÊѲ½¤òÍ¿¤¨¤Æ¤¤¤ë¤³¤È¤ËÃí°Õ¡¥ ¤¿¤À¤·¡¤reflist ¤Î3Í×ÁǤÎÃÍ(¥¢¥É¥ì¥¹)¤¬ÊѲ½¤·¤¿¤Î¤Ç¤Ï¤Ê¤¯¡¤ ¤½¤Î»Ø¤·¼¨¤¹Ãͤ¬ÊѤ俤À¤±¤Ç¤¢¤ë¤³¤È¤Ëα°Õ¤»¤è¡¥¤³¤Î¤è¤¦¤Ë Ʊ¤¸»²¾È¤¬Ê£¿ô¸Ä½ê¤Ç»ÈÍѤµ¤ì¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¤¤¢¤ë¾ì½ê¤Ç¤ÎÂåÆþ¤¬ Ê̤ξì½ê¤Ë±Æ¶Á¤ò¤ª¤è¤Ü¤¹¤³¤È¤ò¥¨¥¤¥ê¥¢¥·¥ó¥°(aliasing)¤È¤¤¤¤¡¤ Ì¿Îá·¿¸À¸ì¤Î¥×¥í¥°¥é¥ß¥ó¥°¤ÇƬ¤òǺ¤Þ¤»¤ë¼ï¤Î°ì¤Ä¤Ç¤¢¤ë¡¥

¤Þ¤¿¡¤»²¾È¤Î»²¾È¤ò¹Í¤¨¤ë¤³¤È¤â¤Ç¤­¡¤C¤Ë¤ª¤±¤ë¥Ý¥¤¥ó¥¿¤Î¤è¤¦¤Ë°·¤¦¤³¤È¤¬¤Ç¤­¤ë¡¥

# let refp = ref p and refq = ref q;;
val refp : int ref ref = contents = contents = 100
val refq : int ref ref = contents = contents = 2
# !refq := !(!refp);;
- : unit = ()
# (!p, !q);;
- : int * int = (100, 100)

7.1.2  ¹¹¿·²Äǽ¥ì¥³¡¼¥É

¤³¤ì¤Þ¤Ç¤ß¤¿¥ì¥³¡¼¥É¤Ç¤Ï¥Õ¥£¡¼¥ë¥É¤ÎÃͤϹ¹¿·¤Ç¤­¤Ê¤«¤Ã¤¿¡¥with ¤ò ÍѤ¤¤Æ¤â¡¤¿·¤·¤¤¥Õ¥£¡¼¥ë¥É¤ò»È¤Ã¤¿¿·¤·¤¤¥ì¥³¡¼¥É¤òÀ¸À®¤·¤Æ¤¤¤¿¡¥ ¼Â¤Ï¡¤Objective Caml ¤Î¥ì¥³¡¼¥É¤Ï¥Õ¥£¡¼¥ë¥ÉËè¤Ë¹¹¿·²Äǽ¤«¤É¤¦¤«¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤­ ¤ë¡¥¹¹¿·²Äǽ¥Õ¥£¡¼¥ë¥É¤Ë¤Ï·¿Àë¸À»þ¤Ë mutable ¥­¡¼¥ï¡¼¥É¤òÍѤ¤¤ë¡¥

# type teacher = {name : string; mutable office : string};;
type teacher =  name : string; mutable office : string; 
# let t = {name = "Igarashi"; office = "140"};;
val t : teacher = name = "Igarashi"; office = "140"

¥Õ¥£¡¼¥ë¥É¤Î¹¹¿·¤Ï¡¤

⟨ ¼°1 ⟩.⟨ ¥Õ¥£¡¼¥ë¥É̾ ⟩ <- ⟨ ¼°2

¤È¤¤¤¦·Á¤Ç¡¤⟨ ¼°1 ⟩¤ÎÃͤǤ¢¤ë¥ì¥³¡¼¥É¤Î⟨ ¥Õ¥£¡¼¥ë¥É̾ ⟩¥Õ¥£¡¼ ¥ë¥É¤ÎÆâÍƤò ⟨ ¼°2 ⟩ ¤ÇÃÖ´¹¤¨¤ë¡¥

# t.office <- "142";;
- : unit = ()
# t;;
- : teacher = name = "Igarashi"; office = "142"

7.1.3  ÇÛÎó

ÇÛÎó¤ÏƱ¤¸¼ïÎà¤ÎÃͤν¸¹ç¤òɽ¤¹¥Ç¡¼¥¿¤È¤¤¤¦°ÕÌ£¤Ç¤Ï¥ê¥¹¥È¤È»÷Ä̤äƤ¤¤ë¤¬¡¤ Ťµ¤ÏÀ¸À®»þ¤Ë¸ÇÄê¤Ç¤¢¤ê¡¤¤É¤ÎÍ×ÁǤˤâľÀÜ(ÀèƬ¤«¤é½ç¤Ëé¤ë¤³¤È¤Ê¤¯)¥¢¥¯¥» ¥¹¤Ç¤­¤ë¡¥¤Þ¤¿¡¤³ÆÍ×ÁǤò¹¹¿·¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥ÇÛÎó¤Ë¤Ï¡¤Í×ÁÇ·¿¤ò t ¤È¤· ¤Æ t array ¤È¤¤¤¦·¿¤¬Í¿¤¨¤é¤ì¤ë¡¥ÇÛÎó¤ÎÀ¸À®¡¤Í×ÁǤλ²¾È¡¤¹¹¿·¤Ï¤½¤ì¤¾¤ì¡¤

[|⟨ ¼°1 ⟩; ⟨ ¼°2 ⟩; …; ⟨ ¼°n ⟩|]
⟨ ¼°1 ⟩.(⟨ ¼°2 ⟩)
⟨ ¼°1 ⟩.(⟨ ¼°2 ⟩) <- ⟨ ¼°3

¤È¤¤¤¦·Á¤Ç¹Ô¤¤¡¤n Í×ÁǤÎÇÛÎó¤Ç½é´üÃͤ¬¤½¤ì¤¾¤ì ⟨ ¼°i ⟩¤Ç¤¢¤ë ¤â¤Î¡¤ÇÛÎó⟨ ¼°1 ⟩¤Î ⟨ ¼°2 ⟩ÈÖÌܤÎÍ×ÁÇ¡¤ ÇÛÎó⟨ ¼°1 ⟩¤Î⟨ ¼°2 ⟩ÈÖÌܤÎÍ×ÁǤò⟨ ¼°3 ⟩¤Ç ¹¹¿·¡¤¤È¤¤¤¦°ÕÌ£¤Ç¤¢¤ë¡¥ÇÛÎó¤ÎÂ礭¤µ¤ò±Û¤¨¤¿À°¿ô¤ÇÍ×ÁǤ˥¢¥¯¥»¥¹¤¹¤ë¤È Invalid_argument ¤È¤¤¤¦Îã³°¤¬È¯À¸¤¹¤ë¡¥

7.1.4  Â¿ÁêÀ­¤È»²¾È

Âè4¾Ï¤Ç¿ÁêÀ­¤Ë¤Ä¤¤¤Æ±ä¤Ù¤¿¤È¤­¤Ë¡¤Objective Caml ¤Ç¤Ï¿ÁêÀ­ ¤ÏÃÍ¿Áꡤ¤¹¤Ê¤ï¤Á let ¤Ç̾Á°¤¬Í¿¤¨¤é¤ì¤ë¼° (let x = ... ¤Î ... Éôʬ) ¤¬ÃͤǤ¢¤ë¤È¤­¤Î¤ß¡¤¤½¤ÎÊÑ¿ô(x)¤¬Â¿ÁêŪ¤Ë»È¤¨¤ë¤³¤È¤ò¸«¤¿¡¥¤³ ¤³¤Ç¤Ï¡¤¤½¤ÎÀ©¸Â¤ÎÍýͳ¤òÀâÌÀ¤¹¤ë¡¥

¤Þ¤º¤Ï¡¤ÃÍ¿Áê¤ÎÀ©¸Â¤¬¤Ê¤«¤Ã¤¿¤È²¾Äꤷ¤Æ¤ß¤è¤¦¡¥°Ê²¼¤Ï²¾ÁۤΠObjective Caml ¥»¥Ã¥·¥ç ¥ó¤Ç¤¢¤ë¡¥¤Þ¤º¤Ï¶õ¥ê¥¹¥È¤Ø¤Î»²¾È¤òÄêµÁ¤¹¤ë¡¥

# let x = ref [];;
val x : 'a list ref = {contents=[]}

»²¾È x ¤Ë³ÊǼ¤µ¤ì¤Æ¤¤¤ë¤Î¤Ï¶õ¥ê¥¹¥È¤Ç¤¢¤ë¤Î¤Ç¡¤¤½¤Î ÆâÍƤÏÍÍ¡¹¤ÊÍ×ÁÇ¤È cons ¤Ç¤­¤ë¡¥

# (2 :: !x, true :: !x);;
- : int list * bool list = ([2], [true])

¤Þ¤¿¡¤¤É¤ó¤Ê¥ê¥¹¥È¤Ç¤âÂåÆþ¤Ç¤­¤ë¤Ï¤º¤Ç¤¢¤ë¡¥

# x := [1];;
- : unit = ()

¤·¤«¤·¡¤Àè¤Û¤É¤ÏÀµ¤·¤«¤Ã¤¿¼° true :: !x ¤¬¡¤¤Ê¤ó¤Èº£²ó¤Ï true ¤ò [1] ¤Ë cons ¤·¤è¤¦¤È¤·¤Æ¤·¤Þ¤¦¡¥

# true :: !x;;
??

¤³¤Î¸½¾Ý¤Ï¡¤¤¿¤Àñ¤Ëlet ¤ÇÄêµÁ¤µ¤ì¤ë±¦Êդμ°¤Î·¿¤Ë ref ¤¬ Æþ¤Ã¤Æ¤¤¤ë¤«¤é¡¤¤È¤¤¤¦¤ï¤±¤Ç¤Ï¤Ê¤¤¡¥Î㤨¤Ð¡¤°Ê²¼¤Î¤è¤¦¤Ê¥×¥í¥°¥é¥à¤Ç ¾å¤ÈƱÍͤʤ³¤È¤¬¤Ç¤­¤Æ¤·¤Þ¤¦¡¥

# let (get, set) =
    let r = ref [] in
    ((fun () -> !r), (fun x -> r:=x));;
val get : unit -> 'a list = <fun>
val set : 'a list -> unit = <fun>
# 1 :: get ();;
- : int list = [1]
# "abc" :: get ();;
- : string list = ["abc"]
# set ["abc"];;
- : unit = ()
# 1 :: get ();;
??

¤³¤Î¤è¤¦¤Ê¥×¥í¥°¥é¥à¤¬Îɤ¯¤Ê¤¤Íýͳ¤Ï¡¤±¦ÊÕ¤¬»²¾È¤òÀ¸À®¤¹¤ë¤è¤¦¤Ê¼° ¤Ç¤¢¤ê¡¤¤«¤Ä¡¤À¸À®¤µ¤ì¤ë»²¾È¤Î·¿¤Ë·¿ÊÑ¿ô¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¤¿¤á¤Ç¤¢¤ë¡¥ ¤³¤Î¤è¤¦¤Ê¾ì¹ç¡¤let ¤Î¸å¤Ç·¿ÊÑ¿ô¤¬Ê£¿ô¤Î·¿¤Ë¶ñÂ⽤µ¤ì¤Æ¤·¤Þ¤¦ ¤³¤È¤Ç¡¤»²¾È¤Ë³ÊǼ¤·¤¿Ãͤ¬Ê̤η¿¤È¤·¤Æ¼è¤ê½Ð¤µ¤ì¤Æ¤·¤Þ¤¦¤³¤È¤Ë¤Ê¤ë¡¥ »÷¤¿¤è¤¦¤ÊµÄÏÀ¤¬¹¹¿·²Äǽ¥ì¥³¡¼¥É¡¦ÇÛÎó¤ËÂФ·¤Æ¤â²Äǽ¤Ç¤¢¤ë¡¥

¤³¤Î»öÂÖ¤òËɤ°¤¿¤á¤Ë Objective Caml (µÚ¤Ó Standard ML) ¤Ç¤Ï¡¤±¦Êդμ°¤¬»²¾È (¹¹¿·²Äǽ¥ì¥³¡¼¥É¡¦ÇÛÎó)¤òÀ¸À®¤·¤Ê¤¤¤³¤È¤¬¤ï¤«¤Ã¤Æ¤¤¤ë»þ¤Ë¡¤Â¿ÁêÀ­¤òµö ¤¹¤³¤È¤Ë¤·¤Æ¤¤¤ë¡¥Í¿¤¨¤é¤ì¤¿¼°¤¬¼Â¹Ô¤Î²áÄø¤Ç»²¾È¤òÀ¸À®¤¹¤ë¤«¤É¤¦¤«¤Ï (¥Á¥å¡¼¥ê¥ó¥°¥Þ¥·¥ó¤ÎÄä»ßÀ­È½Äê¤ÈƱ¤¸¤¯)·èÄêÉÔǽ¤Ê¤Î¤Ç¡¤ÊݼéŪ¤Ê½½Ê¬¾ò ·ï¤È¤·¤Æ¡Ö±¦ÊÕ¤¬¡¤»²¾È¤òÀ¸À®¤·¤Ê¤¤¤É¤³¤í¤«¡¤¤½¤â¤½¤â·×»»¼«ÂÎȯÀ¸¤¹¤ë¤³ ¤È¤Î¤Ê¤¤¡¤ÃͤǤ¢¤ë¤³¤È¡×¤È¤¤¤¦¾ò·ï¤òºÎÍѤ·¤Æ¤¤¤ë¡¥¤³¤ì¤¬ÃÍ¿Áê¤ÎͳÍè¤Ç ¤¢¤ë¡¥¤³¤³¤Ç¡¤ÃͤȤÏ

¤Ê¤É¤Ç¤¢¤ë¡¥ÃͤǤϤʤ¤¤â¤Î¤Ï

¤Ê¤É¤Ç¤¢¤ë¡¥

¿ÁêÀ­¤È»²¾È¤ÎÌäÂê¤Ï¡¤ML ¤ÎȯÌÀ°ÊÍ衤ÃÍ¿Áê¤Ë¸Â¤é¤º¤¤¤í¤¤¤í¤Ê²ò·èºö¤¬ µÄÏÀ¤µ¤ì¤Æ¤­¤Æ¤¤¤ë¤¬¡¤Ì¤¤À¤Ë³§¤¬Ç¼ÆÀ¤¹¤ë¤â¤Î¤ÏÆÀ¤é¤ì¤Æ¤¤¤Ê¤¤¡¥

7.1.5  Case Study: ¥ª¥Ö¥¸¥§¥¯¥È»Ø¸þÉ÷¥×¥í¥°¥é¥ß¥ó¥°

Java ¤Ê¤É¤Î¥ª¥Ö¥¸¥§¥¯¥È»Ø¸þ¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ë¤ª¤±¤ë ¥ª¥Ö¥¸¥§¥¯¥È¤È¤Ï

ÆâÉô¾õÂÖ¤¬±£Ê䵤줿¥Ç¡¼¥¿ ¤È ¤½¤ì¤òÁàºî¤¹¤ë¥á¥½¥Ã¥É(·²)

¤ÎÁȤǤ¢¤ë¤È¹Í¤¨¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥Objective Caml¼«ÂΤˡ¤¤½¤Î¤è¤¦¤Ê ¥ª¥Ö¥¸¥§¥¯¥È¤òÄêµÁ¤¹¤ë»ÅÁȤߤ¬¤¢¤ë¤¬¡¤¤³¤³¤Ç¤Ï¡¤¤³¤ì¤Þ¤Ç¤Ë ³Ø¤ó¤Àµ¡¹½¤ò»È¤Ã¤Æ¥ª¥Ö¥¸¥§¥¯¥È¤òÌÏÊ路¤Æ¤ß¤è¤¦¡¥

¤Þ¤º¡¤°Ê²¼¤Î¤è¤¦¤Ê(°ì¼¡¸µ)ÅÀ¥ª¥Ö¥¸¥§¥¯¥È¤ò¹Í¤¨¤ë¡¥

¤³¤Î¤¿¤á¤Ë¡¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤È¤Ê¤ë·¿¤ò ¥á¥½¥Ã¥É¤Î¥ì¥³¡¼¥É·¿¤È¤·¤ÆÄêµÁ¤¹¤ë¡¥Ì¾Á°¤ÎºÇ¸å¤Î I ¤Ï ¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤Ç¤¢¤ë¤³¤È¤ò¼¨¤·¤Æ¤¤¤ë¡¥

# type pointI = {get: unit -> int; set: int -> unit; inc: unit->unit};;
type pointI =  get : unit -> int; set : int -> unit; inc : unit -> unit; 

ÅÀ¥ª¥Ö¥¸¥§¥¯¥È¤Ï°Ê²¼¤Î¤è¤¦¤ËÄêµÁ¤Ç¤­¤ë¡¥ “¥á¥½¥Ã¥É¸Æ¤Ó½Ð¤·” ¤Ï ¥ì¥³¡¼¥É¤ÎÍ×ÁǤòŬÍѤ¹¤ë¤³¤È¤Ç¡¤¼Â¸½¤Ç¤­¤ë¡¥

# let p = 
    let x = ref 0 in
    let rec this () =
      {get=  (fun () -> !x); 
       set=  (fun newx -> x:=newx);
       inc= (fun () -> (this ()).set ((this ()).get () + 1))} in
    this ();;
val p : pointI = get = <fun>; set = <fun>; inc = <fun>
# p.get();;
- : int = 0
# p.inc();;
- : unit = ()
# p.get();;
- : int = 1

inc ¥á¥½¥Ã¥É¤Ï¼«Ê¬¼«¿È¤Î set ¤È get ¤òÁȤ߹ç¤ï¤»¤Æ¼ÂÁõ¤·¤Æ¤¤¤ë¡¥ ¼«Ê¬¼«¿È¤Î¥á¥½¥Ã¥É¤Î¸Æ¤Ó½Ð¤·¤ÏºÆµ¢¤ò»È¤Ã¤Æ¼ÂÁõ¤·¤Æ¤ª¤ê¡¤this ¤Ï¡Ö¼« ʬ¼«¿È¤Î¥á¥½¥Ã¥É¤ÎÁȡפòɽ¸½¤·¤Æ¤¤¤ë¡¥¤½¤Î°ÕÌ£¤«¤é¤Ï this ¤Ï pointI ·¿ ¤Î¥ì¥³¡¼¥É¤È¤Ê¤ë¤Î¤¬ÍýÁÛ¤À¤¬¡¤¤³¤³¤Ç¤ÏºÆµ¢Åª¤ËÄêµÁ¤·¤Æ¤¤¤ë´Ø·¸¤Ç unit -> pointI ¤È¤¤¤¦´Ø¿ô¤È¤·¤ÆÄêµÁ¤·¤Æ¤¤¤ë¡¥¤è¤Ã¤Æ¥á¥½¥Ã¥ÉÆâ¤Ç »ÈÍѤ¹¤ë¤È¤­¤Ë¤Ï this () ¤È¤¤¤¦·Á¤Ç¥ì¥³¡¼¥É¤òµá¤á¤Æ¤«¤é .get ¤Ê¤É¤Ç¥á¥½¥Ã¥É¤òÆÀ¤Æ¤¤¤ë¡¥

¤µ¤Æ¡¤¥¯¥é¥¹¤Ï¥ª¥Ö¥¸¥§¥¯¥È¤òÀ¸À®¤¹¤ë¤¿¤á¤Î¥á¥½¥Ã¥É¼ÂÁõ¤Ç¤¢¤ë¤«¤é¡¤ ¶á»÷Ū¤Ë¤Ï½é´ü¾õÂÖ¤ò°ú¿ô¤È¤·¤Æ¥ª¥Ö¥¸¥§¥¯¥È¤òÊÖ¤¹´Ø¿ô¤È»×¤¨¤ë¡¥

# let pointC x =
    let rec this () =
      {get=  (fun () -> !x); 
       set=  (fun newx -> x:=newx);
       inc= (fun () -> (this ()).set ((this ()).get () + 1))} in
    this ();;
val pointC : int ref -> pointI = <fun>
# let new_point x = pointC (ref x);;
val new_point : int -> pointI = <fun>
# let p = new_point 2;;
val p : pointI = get = <fun>; set = <fun>; inc = <fun>
# p.inc(); p.get();;
- : int = 3

´Ø¿ô new_point ¤Ï¥³¥ó¥¹¥È¥é¥¯¥¿¤Î¤è¤¦¤ÊƯ¤­¤ò¤·¤Æ¤¤¤ë¡¥

¤³¤Î¤è¤¦¤Ë¤·¤Æ¡¤·Ñ¾µ¤Ê¤É¤â¤¢¤ëÄøÅÙ¥×¥í¥°¥é¥ß¥ó¥°¤Ç¤­¤ë¡¥Î㤨¤Ð¡¤ ÅÀ¥ª¥Ö¥¸¥§¥¯¥È¤ò·Ñ¾µ¤Ë¤è¤ê³ÈÄ¥¤·¤Æ¿§¤Î¤Ä¤¤¤¿ÅÀ¥ª¥Ö¥¸¥§¥¯¥È (¿·¤·¤¤¥á¥½¥Ã¥É¤È¤·¤Æ¡¤getcolor ¤È¤¤¤¦¥á¥½¥Ã¥É¤ò¹Í¤¨¤ë)¤ò¡¤ ·Ñ¾µ¤¹¤ë¥á¥½¥Ã¥É¤òÆóÅÙµ­½Ò¤¹¤ë¤³¤È¤Ê¤¯¡¤ºÆÍøÍѤ¹¤ë¤è¤¦¤ËÄêµÁ ¤¹¤ë¤³¤È¤â²Äǽ¤Ç¤¢¤ë¡¥¤¿¤À¤·¡¤ Objective Caml ¤ÎÀ©¸Â¤«¤éƱ¤¸¥Õ¥£¡¼¥ë¥É̾¤òÊÌ ¤Î¥ì¥³¡¼¥É·¿¤Î¤â¤Î¤È¤·¤ÆƱ»þ¤Ë¤Ï»È¤¨¤Ê¤¤1¤Î¤Ç¡¤Ê̤Υ᥽¥Ã¥É̾¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¡¤ÈÑ»¨¤Ë¤Ê¤Ã¤Æ¤¯¤ë¡¥

7.2  À©¸æ¹½Â¤

ºÇ½é¤ÎÀâÌÀ¤Ç¤â¿¨¤ì¤¿¤è¤¦¤Ë¡¤ÉûºîÍѤòȼ¤¦·×»»¤Ï¡¤ÉûºîÍѤε¯¤³¤ë½çÈ֤˵¤¤ò¤Ä¤± ¤Æ¥×¥í¥°¥é¥ß¥ó¥°¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥Î㤨¤Ð¡¤°Ê²¼¤Î¤è¤¦¤Ê¥×¥í¥°¥é¥à

# let x = print_string "Hello, " in
  print_string "World!\n";;
Characters 5-6:
let x = print_string "Hello, " in
^
Warning Y: unused variable x.
Hello, World!
- : unit = ()

¤Ç¡¤»×¤Ã¤¿¤È¤ª¤ê¤Î½ÐÎϤ¬ÆÀ¤é¤ì¤ë¤Î¤Ï¡¤x ¤¬Â«Çû¤µ¤ì¤ëÃͤη׻»(¤È¡¤¤½ ¤ì¤Ëȼ¤¦ÉûºîÍÑ)¤¬ in °Ê²¼¤Î·×»»¤è¤ê¤âÁ°¤Ëµ¯¤³¤ë¤¿¤á¤Ç¤¢¤ë¡¥Objective Caml ¤ÇÆäËÃí°Õ¤¬É¬ÍפʤΤϡ¤´Ø¿ô¸Æ½Ð¤·¤Ê¤É¤ÎÊ£¿ô¤Î°ú¿ô¤Îɾ²Á½ç½ø¤Ç¤¢¤ë¡¥

# let f x y = 2 in
  f (print_string "Hello, ") (print_string "World\n");;
World
Hello, - : int = 2
# (print_string "Hello, ", print_string "World\n");;
World
Hello, - : unit * unit = ((), ())

¸½ºß¤Î¼ÂÁõ¤Ç¤Ï¡¤¸å¤í¤Î°ú¿ô¤«¤é½ç¤Ëɾ²Á¤¬¹Ô¤ï¤ì¤ë¤¬¡¤Objective Caml ¤Î»ÅÍͤȤ·¤Æ¤Ï ̤ÄêµÁ¤Ê¤Î¤Ç¡¤°ú¿ô¤Î·×»»¤ËÉûºîÍѤòȼ¤¦¤È¤­¤Ë¤Ï¡¤let ¤Ê¤É¤òÍѤ¤¤Æ ·×»»½ç½ø¤ò¥×¥í¥°¥é¥àÃæ¤ËÌÀ¼¨Åª¤Ë¤¹¤ë¤Ù¤­¤Ç¤¢¤ë¡¥

Objective Caml ¤Ç¤Ï¡¤Ì¿Îá·¿¸À¸ì¤Ë¸«¤é¤ì¤ë¤è¤¦¤ÊÀ©¸æ¹½Â¤¤¬¤¤¤í¤¤¤íÍÑ°Õ¤µ¤ì¤Æ¤¤¤ë¡¥ ¤Þ¤º¡¤¾å¤Î¥×¥í¥°¥é¥à¤Î¤è¤¦¤Ê¡Ö¥³¥Þ¥ó¥ÉÎó¡×¤òɽ¸½¤¹¤ë¤¿¤á¤Î µ¡Ç½¤È¤·¤Æ¡¤

⟨ ¼°1 ⟩; ⟨ ¼°2 ⟩; ⋯; ⟨ ¼°n

¤È¤¤¤¦·Á¤Î¼°¤¬ÍÑ°Õ¤µ¤ì¤Æ¤¤¤ë¡¥¤³¤Î¼°Á´ÂΤϡ¤⟨ ¼°1 ⟩ ¤«¤é½çÈÖ¤Ëɾ²Á¤ò¹Ô¤¤¡¤⟨ ¼°n ⟩ ¤ÎÃͤòÁ´ÂΤÎÃͤȤ¹¤ë¡¥ ¤Þ¤¿¡¤ÅÓÃæ¤Î¼°¤Î·ë²Ì¤Ï¼Î¤Æ¤é¤ì¤Æ¤·¤Þ¤¦¤Î¤Ç¡¤ ⟨ ¼°n−1 ⟩ ¤Þ¤Ç¤Î¼°¤ÏÄ̾ï¤ÏÉûºîÍѤòȼ¤¦¤â¤Î¤Ç¤¢¤ë¡¥ Objective Caml ¤Ç¤Ï¡¤⟨ ¼°i ⟩ (i < n) ¤¬ unit·¿¤Ç¤Ê¤¤ ¾ì¹ç¤Ë¤Ï warning ¤òȯ¹Ô¤¹¤ë¡¥() ¤Ç¤Ê¤¯¡¤°ÕÌ£¤Î¤¢¤ëÃͤòÊÖ¤¹¼°¤ÎÃͤò¼Î ¤Æ¤Æ¤·¤Þ¤¦¤Î¤Ï¥Ð¥°¤Ç¤¢¤ë¤³¤È¤¬Â¿¤¤¤«¤é¤Ç¤¢¤ë¡¥ ¥×¥í¥°¥é¥Þ¤¬¡¤Ãͤ¬Íפé¤Ê¤¤¤³¤È¤ò³Î¿®¤·¤Æ¤¤¤ë¾ì¹ç¤Ï¡¤ignore ´Ø¿ô¤ò¤Ä ¤«¤Ã¤Æ¡¤ÌÀ¼¨Åª¤Ë¤½¤Î¤³¤È¤ò¼¨¤¹¤³¤È¤¬¿ä¾©¤µ¤ì¤ë¡¥

# ignore;;
- : 'a -> unit = <fun>
# let print_hello () = print_string "Hello, "; 0;;
val print_hello : unit -> int = <fun>
# print_hello (); print_string "World";;
Characters 0-14:
Warning S: this expression should have type unit.
print_hello (); print_string "World";;Hello, World- : unit = ()
# ignore (print_hello ()); print_string "World\n";;
Hello, World
- : unit = ()

¤Þ¤¿¡¤¥ë¡¼¥×¤Î¤¿¤á¤Î¼°¤È¤·¤Æ¡¤while¼°¡¤for¼°¤¬ÍÑ°Õ¤µ¤ì¤Æ¤¤¤ë¡¥ while¼°¤Ï

while ⟨ ¼°1 ⟩ do ⟨ ¼°2 ⟩ done

¤È¤¤¤¦·Á¤Ç¡¤bool·¿¤Î¼°⟨ ¼°1 ⟩¤Îɾ²Á·ë²Ì¤¬ false ¤Ë¤Ê¤ë¤Þ¤Ç ⟨ ¼°2 ⟩ ¤Îɾ²Á¤ò¹Ô¤¦¡¥¼°Á´ÂÎ¤Ï () ¤òÊÖ¤¹¡¥ for¼°¤Ï

for ⟨ ÊÑ¿ô̾ ⟩ = ⟨ ¼°1 ⟩ to ⟨ ¼°2 ⟩ do ⟨ ¼°3 ⟩ done

¤â¤·¤¯¤Ï

for ⟨ ÊÑ¿ô̾ ⟩ = ⟨ ¼°1 ⟩ downto ⟨ ¼°2 ⟩ do ⟨ ¼°3 ⟩ done

¤È¤¤¤¦·Á¤Ç¡¤¤Þ¤º⟨ ¼°1 ⟩¡¤⟨ ¼°2 ⟩¤òÀ°¿ô n, p ¤Ëɾ²Á¤¹¤ë¡¥¤½¤Î¸å¡¤⟨ ÊÑ¿ô̾ ⟩¤òn, n+1, …, p (downto ¤Î¾ì ¹ç¤Ï n, n−1, …, p)¤Î½ç¤Ë«Çû¤·¤Æ ⟨ ¼°3 ⟩¤òɾ²Á¤¹¤ë¡¥ ⟨ ÊÑ¿ô̾ ⟩¤ÎÍ­¸úÈϰϤÏ⟨ ¼°3 ⟩¤Ç¤¢¤ë¡¥¼°Á´ÂΤÎÃÍ¤Ï () ¤Ç ¤¢¤ë¡¥

¤³¤ì¤é¤Î¥ë¡¼¥×¤òɽ¸½¤¹¤ë¼°¤Ï¡¤ÉûºîÍѤòȼ¤ï¤Ê¤¤¤È¤Þ¤Ã¤¿¤¯°ÕÌ£¤¬¤Ê¤¤¤³¤È¤ËÃí °Õ¤¹¤ë¤³¤È¡¥ÉûºîÍѤ¬¤Ê¤±¤ì¤Ð¡¤while ¤Î·«¤êÊÖ¤·¾ò·ï¤Î¼°¤Ï¾ï¤Ë Ʊ¤¸ÃͤòÊÖ¤¹¤·¡¤for ¼°¤â·×»»¤ò¤¤¤¯¤é¤«·«¤êÊÖ¤·¤Æ () ¤òÊÖ¤¹¤À¤±¤Ç¤¢¤ë¡¥

°Ê²¼¤Ï¥­¡¼¥Ü¡¼¥É¤«¤éÆþÎϤµ¤ì¤¿¹Ô¤òÆó¤Ä¤Ä¤Ê¤²¤Æ²èÌ̤˽ÐÎϤ·ÊÖ¤¹ ´Ø¿ô¤Ç¤¢¤ë¡¥½ªÎ»¤Ë¤Ï¥Ô¥ê¥ª¥É¤À¤±¤«¤é¤Ê¤ë¹Ô¤òÆþÎϤ¹¤ë¡¥

# let parrot () =
    let s = ref "" in
      while (s := read_line (); !s <> ".") do
        print_string !s;
        print_endline !s;
      done;;
val parrot : unit -> unit = <fun>

print_endline ´Ø¿ô¤Ï°ú¿ô¤Îʸ»úÎó¤Ë²þ¹Ô¤ò¤Ä¤±¤Æ½ÐÎϤ¹¤ë¤¿¤á¤Î ´Ø¿ô¤Ç¤¢¤ë¡¥

7.3  Îã³°½èÍý

Îã³°(exception)¤Ï¡¢·×»»¤ò¿Ê¤á¤Æ¤¤¤¯²áÄø¤Ç¤Ê¤ó¤é¤«¤ÎÍýͳ¤Ç·× »»¤òÃæÃǤ»¤¶¤ë¤ò¤¨¤Ê¤¤¾õ¶·¤òɽ¸½¤¹¤ë¤¿¤á¤Î»ÅÁȤߤǤ¢¤ë¡£¤Ê¤ó¤é¤«¤ÎÍýͳ ¤ÎÎã¤È¤·¤Æ¤Ï¡¢0¤Ç¤Î½ü»»¡¢¥Ñ¥¿¡¼¥ó¥Þ¥Ã¥Á¤Î¼ºÇÔ¡¢¥Õ¥¡¥¤¥ë¤Î¥ª¡¼¥×¥ó¤Î¼º ÇÔ¡¢¤Ê¤Éŵ·¿Åª¤Ë¤Ï¼Â¹Ô»þ¥¨¥é¡¼¤ÎȯÀ¸¤·¤¿¾õ¶·¤¬Â¿¤¤¡£´ðËÜŪ¤Ë¤ÏÎã³°¤¬È¯ À¸¤¹¤ë¤È»Ä¤ê¤Î·×»»¤ò¤»¤º¤ËÃæÃǤ·¤ÆÃͤòÊÖ¤µ¤º¼Â¹Ô¤ò½ªÎ»¤·¤Æ¤·¤Þ¤¦¡£(¥¤ ¥ó¥¿¥é¥¯¥Æ¥£¥Ö¥³¥ó¥Ñ¥¤¥é¤Ç¤ÏÆþÎÏ¥×¥í¥ó¥×¥È¤ËÌá¤ë¡£) Î㳰ȯÀ¸¤Ï Objective Caml ¼°¤¬¤½¤Î·¿¤ÎÃͤòÊÖ¤µ¤Ê¤¤Í£°ì¤ÎÎã¤Ç¤¢¤ë¡£

°Ê²¼¤ÏÎã³°¤òȯÀ¸¤¹¤ë¼°¤Ç¤¢¤ë¡£2ÈÖÌܤμ°¤Ï¥Õ¥¡¥¤¥ë¤ò³«¤¯¤¿¤á¤Î´Ø¿ô¤¬¸Æ¤Ó½Ð¤µ ¤ì¤Æ¤¤¤ë¤¬¡¤¥Õ¥¡¥¤¥ë¤¬¤Ê¤¤¤È¤¤¤¦Îã³°¤¬È¯À¸¤·¤Æ¤¤¤ë¡¥ºÇ¸å¤Î¼°¤Ç¤Ï¡¢4 / 0 ¤Î·ë²Ì¤Î½ÐÎϤÀ¤±¤Ç¤Ê¤¯»Ä¤ê¤Î·×»»¤Ç¤¢¤ëʸ»úÎó¤Î½ÐÎϤ¬¹Ô¤ï¤ì¤º¤Ë¼Â¹Ô¤¬ÃæÃǤµ ¤ì¤Æ¤¤¤ë¤³¤È¤¬¤ï¤«¤ë¤À¤í¤¦¡£

# hd [];;
Exception: Match_failure ("", 66, 7).
# open_in "";;
Exception: Sys_error ": No such file or directory".
# print_string (string_of_int (4 / 0)); print_string "not printed";;
Exception: Division_by_zero.

¤½¤ì¤¾¤ì¡¢¥Ñ¥¿¡¼¥ó¥Þ¥Ã¥Á¥ó¥°¤¬¼ºÇÔ¤·¤¿¤³¤È¤ò¼¨¤¹Match, OS¤ËÂФ¹¤ë¥·¥¹¥Æ¥à¥³¡¼¥ë´ØÏ¢¤Î¥¨¥é¡¼¤¬È¯À¸¤·¤¿¤³¤È¤ò¼¨¤¹Sys_error, 0¤Ç¤Î½ü»»¤¬È¯À¸¤·¤¿¤³¤È¤ò¼¨¤¹Division_by_zero, ¤¬È¯À¸¤·¤Æ¤¤¤ë¡£¤Þ¤¿¡¢¤¤¤¯¤Ä¤«¤ÎÎã³°¤Ç¤ÏÎã³°¤Î̾Á°¤Î¤¢¤È¤ËObjective Caml¤Î Ãͤ¬Éղ䵤ì¤ÆÎã³°¤Ë´Ø¤¹¤ë¾Ü¤·¤¤¾ðÊó¤òÄ󶡤·¤Æ¤¤¤ë¡£

Objective Caml ¤Ç¤Ï¡¢¥×¥í¥°¥é¥Þ¤¬¿·¤·¤¤Îã³°¤òÀë¸À¡¢¤½¤ÎÎã³°¤òȯÀ¸¤µ¤»¤ë¤³¤È¤¬¤Ç ¤­¤ë¡£¤Þ¤¿¡¢Îã³°¤ÎȯÀ¸¤ò¥×¥í¥°¥é¥àÃæ¤Ç¸¡ÃΤ·¡¢ÃæÃǤµ¤ì¤ëÁ°¤Ë½èÍý¤òºÆ³« ¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£

7.3.1  exception Àë¸À¤Èraise ¼°

¿·¤·¤¤Îã³°¤ÎÀë¸À¤Ï exception Àë¸À¤Ç¹Ô¤¦¡£

# exception Foo;;
exception Foo

Îã³°¤Î̾Á°¤Ï¡¢¥ô¥¡¥ê¥¢¥ó¥È·¿¤Î¥³¥ó¥¹¥È¥é¥¯¥¿¤ÈƱÍÍ¡¢±ÑÂçʸ»ú¤Ç »Ï¤Þ¤é¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£Îã³°¤òȯÀ¸¤µ¤»¤ë¤Î¤Ï raise ¼°¤Ç¹Ô¤¦¡£

# raise Foo;;
Exception: Foo.

raise ¼°¤Ï¡¢ÃͤòÊÖ¤µ¤º¤ËÎã³°¤òȯÀ¸¤µ¤»¤ë¤Î¤Ç¡¢Ç¤°Õ¤Î¾ì½ê¤Ç ÍѤ¤¤ë¤³¤È¤¬¤Ç¤­¤ë¡£Ê̤θÀ¤¤Êý¤ò¤¹¤ë¤È raise ¼°¤Ë¤ÏǤ°Õ¤Î·¿ ¤¬Í¿¤¨¤é¤ì¤ë¡£²¼¤Î´Ø¿ôÄêµÁ¤ÎÎã¤Ç¤Ï¡¢raise Foo ¼°¤¬ ¿¿µ¶ÃͤäÀ°¿ô¤ÎɬÍפʾì½ê¤Ç»È¤ï¤ì¤Æ¤¤¤ë¤³¤È¤¬¤ï¤«¤ë¤À¤í¤¦¡£

# let f () = if raise Foo then raise Foo else 3;;
val f : unit -> int = <fun>

Àè¤Ë¸«¤¿¡¢Sys_error ¤Î¤è¤¦¤ÊÃͤòȼ¤¦Îã³°¤Ï¡¢Àë¸À»þ¤Ë ²¿¤Î·¿¤ÎÃͤòȼ¤¦¤«¤âÀë¸À¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£°Ê²¼¤ÏÀ°¿ô¤ò ȼ¤¦Îã³°¤ÎÀë¸À¤È raise ¤ÎÎã¤Ç¤¢¤ë¡£

# exception Bar of int;;
exception Bar of int
# raise (Bar 2);;
Exception: Bar 2.

Objective Caml¤Ç¤Ï(raise ¤ÇȯÀ¸¤µ¤»¤ëÁ°¤Î)Îã³°¤Ë¤Ï exn ·¿¤¬Í¿¤¨¤é¤ì¡¢ Âè°ìµé¤ÎÃͤȤ·¤Æ´Ø¿ô¤ËÅϤ·¤¿¤ê¡¢¥Ç¡¼¥¿¹½Â¤¤Ë³ÊǼ¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£ Ê̤θ«Êý¤ò¤¹¤ë¤È¡¤exception Àë¸À¤Ë¤è¤ê¡¤¿·¤·¤¤¥³¥ó¥¹¥È¥é¥¯¥¿¤¬ exn ·¿¤ËÄɲ䵤ì¤ë¤³¤È¤Ë¤Ê¤ë¡¥ ¤Þ¤¿¥ô¥¡¥ê¥¢¥ó¥È·Á¤ÈƱÍͤ˥ѥ¿¡¼¥ó¥Þ¥Ã¥Á¤Ç¡¢Îã³°¥³¥ó¥¹¥È¥é¥¯¥¿¤¬ ŬÍѤµ¤ì¤¿Ãͤò¼è¤ê½Ð¤¹¤³¤È¤¬¤Ç¤­¤ë¡£

# let exnlist = [Bar 3; Foo];;
val exnlist : exn list = [Bar 3; Foo]
# let f = function 
      Foo -> 0
    | x -> raise x;;
val f : exn -> int = <fun>
# f Foo;;
- : int = 0
# f (Bar 4);;
Exception: Bar 4.
ɸ½à¥é¥¤¥Ö¥é¥ê¤ÎÎã³°

¤½¤Î¾¤Î¡¤¤¤¤¯¤Ä¤«¤ÎÄêµÁºÑ¤ÎÎã³°¤ò¾Ò²ð¤·¤Æ¤ª¤¯¡¥ Invalid_argument, Failure ¤Ïʸ»úÎó¤òȼ¤¦Îã³°¤Ç¡¤ ¤¤¤¯¤Ä¤«¤Î¥é¥¤¥Ö¥é¥ê´Ø¿ô¤ÇȯÀ¸¤¹¤ë¡¥Á°¼Ô¤Ï´Ø¿ô°ú¿ô¤¬°ÕÌ£¤ò¤Ê¤µ¤Ê¤¤¾ì¹ç¡¤ ¸å¼Ô¤Ï´Ø¿ô°ú¿ô¤ÏÀµ¤·¤¤¤¬²¿¤é¤«¤ÎÍýͳ¤Ç·×»»¤¬¼ºÇÔ¤·¤¿¾ì¹ç¤ËȯÀ¸¤¹¤ë¡¥ Not_found ¤Ïõº÷¤ò¹Ô¤¦´Ø¿ô¤Ç¡¤Ãµº÷Âоݤ¬¸«¤Ä¤«¤é¤Ê¤«¤Ã¤¿¾ì¹ç¤Ë ȯÀ¸¤µ¤»¤ë¤â¤Î¤Ç¤¢¤ë¡¥ End_of_file ¤Ï¥Õ¥¡¥¤¥ë¤«¤é¤ÎÆþÎÏ´Ø¿ô¤¬¥Õ¥¡¥¤¥ë¤Î½ªÃ¼¤ËÅþ㤷¤¿¾ì¹ç¤Ë ȯÀ¸¤¹¤ë¡¥

Î㤨¤Ð¡¤assoc ´Ø¿ô(5.3ÀỲ¾È) ¤Ï °Ê²¼¤Î¤è¤¦¤ËÄêµÁ¤¹¤ë¤Î¤¬¡¤¤è¤ê¡ÖObjective Caml¤é¤·¤¤¡×ÄêµÁ¤Ç¤¢¤ë¡¥

# let rec assoc a = function
     [] -> raise Not_found
   | (a', b) :: rest -> if a = a' then b else assoc a rest;;
val assoc : 'a -> ('a * 'b) list -> 'b = <fun>
# assoc "Osaka" city_phone;;
- : string = "06"
# assoc "Nara" city_phone;;
Exception: Not_found.

¤Þ¤¿ÄêµÁºÑ¤Î´Ø¿ô¤È¤·¤Æ¡¤Îã³°¤òȯÀ¸¤µ¤»¤ë¤À¤±¤Î´Ø¿ô¡¤invalid_arg, failwith ¤Ê¤É¤âÍÑ°Õ¤µ¤ì¤Æ¤¤¤ë¡¥

# failwith "foo";;
Exception: Failure "foo".

7.3.2  Îã³°¤Î¸¡ÃÎ

¼°¤Îɾ²ÁÃæ¤Ëµ¯¤³¤ëÎã³°¤Ï¡¢¤½¤Î¼ïÎब¤ï¤«¤ë¾ì¹ç¤Ë¤Ï¡¢try¼°¤Ç¡¢ ¸¡ÃΤ·¤Æ¸å½èÍý¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤­¤ë¡£try ¼°¤Î°ìÈÌŪ¤Ê·Á¤Ï¡¢ match¼°¤È»÷¤Æ¤¤¤Æ¡¢

try ⟨ ¼° ⟩ with
    ⟨ ¥Ñ¥¿¡¼¥ó1 ⟩ -> ⟨ ¼°1 ⟩
  | ...
  | ⟨ ¥Ñ¥¿¡¼¥ón ⟩ -> ⟨ ¼°n

¤È¤Ê¤ë¡£¤Þ¤º¡¢⟨ ¼° ⟩¤òɾ²Á¤·¡¢Îã³°¤¬È¯À¸¤·¤Ê¤±¤ì¤Ð ¤½¤ÎÃͤòÁ´ÂΤÎÃͤȤ¹¤ë¡£É¾²ÁÅÓÃæ¤ÇÎã³°¤¬ raise ¤µ¤ì¤¿ ¾ì¹ç¤Ë¤Ï¡¢½ç¤Ë¥Ñ¥¿¡¼¥ó¥Þ¥Ã¥Á¤ò¹Ô¤Ã¤Æ¤¤¤­¡¢¥Þ¥Ã¥Á¤·¤¿»þÅÀ¤Ç ⟨ ¼°i ⟩¤òɾ²Á¤·¡¢try¼°Á´ÂΤÎÃͤȤʤ롣 ²¿¤â¥Þ¥Ã¥Á¤¹¤ë¤â¤Î¤¬¤Ê¤«¤Ã¤¿¾ì¹ç¤Ë¤Ï¡¢¤â¤È¤â¤ÈȯÀ¸¤·¤¿ Îã³°¤¬ºÆȯÀ¸¤¹¤ë¡£try ¼°¤ÎÃͤϡ¢⟨ ¼° ⟩, ⟨ ¼°1 ⟩, …, ⟨ ¼°n ⟩ ¤Î¤¤¤º¤ì¤«¤Ë¤Ê¤ë¤Î¤Ç¡¢¤³¤ì¤é¤Î¼°¤Î·¿¤Ï °ìÃפ·¤Æ¤¤¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£

# try 4 + 3 with Division_by_zero -> 9;;
- : int = 7
# try 1 + (3 / 0) with Division_by_zero -> 9;;
- : int = 9
# try 1 + (3 / 0) with Sys_error s -> int_of_string s;;
Exception: Division_by_zero.
# let query_city_phone c = 
    try assoc c city_phone with Not_found -> "999";;
val query_city_phone : string -> string = <fun>
# query_city_phone "Osaka";;
- : string = "06"
# query_city_phone "Nara";;
- : string = "999"

Îã³°¤Î¸¡ÃΤϡ¤¥¨¥é¡¼½èÍý¤Î´ÑÅÀ¤«¤é¤À¤±¤Ç¤Ï¤Ê¤¯¡¤¤è¤ê¸úΨŪ¤Ê ¼Â¹Ô¤Î¤¿¤á¤ËÍѤ¤¤ë¤³¤È¤â¤Ç¤­¤ë¡¥¤¿¤È¤¨¤Ð¡¤À°¿ô¤Î¥ê¥¹¥È¤ÎÍ×ÁǤΠÀѤò·×»»¤¹¤ë¥×¥í¥°¥é¥à¤ò¹Í¤¨¤Æ¤ß¤ë¡¥¤â¤Ã¤È¤âÁÇËѤˤϡ¤

# let rec prod_list = function
      [] -> 1
    | n :: rest -> n * prod_list rest;;
val prod_list : int list -> int = <fun>
# prod_list [2; 3; 4];;
- : int = 24
# prod_list [4; 0; 2; 3; 4];;
- : int = 0

¤ÈÄêµÁ¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥¤·¤«¤·¡¤¤³¤ÎÄêµÁ¤Ï¡¤¥ê¥¹¥È¤Ë 0 ¤¬´Þ¤Þ¤ì¤Æ ¤¤¤¿¾ì¹ç¤Ç¤â¡¤¥ê¥¹¥È¤ÎºÇ¸å¤Þ¤ÇΧµ·¤Ë·×»»¤·¤Æ¤·¤Þ¤¤ÌµÂ̤Ǥ¢¤ë¡¥ ¼¡¤ÎÄêµÁ¤Ï 0 ¤¬½Ð¸½¤·¤¿¤é 0 ¤òÊÖ¤¹¤è¤¦¤Ë¤·¤Æ¡¤0 °Ê¹ß¤ÎÀѤò ·×»»¤·¤Ê¤¤¤è¤¦¤Ë¤·¤Æ¤¤¤ë¤¬¡¤0 °ÊÁ°¤ÎÍ×ÁÇ¤È 0 ¤È¤ÎÀѤò¼è¤Ã¤Æ¤¤¤ë ¤È¤¤¤¦ÌµÂ̤¬¤¢¤ë¡¥

# let rec prod_list = function
      [] -> 1
    | 0 :: _ -> 0
    | n :: rest -> n * prod_list rest;;
val prod_list : int list -> int = <fun>

0 ¤¬½Ð¸½¤·¤¿¾ì¹ç¤Ë¡¤°ìÅÙ¤â³Ý¤±»»¤ò¤·¤Ê¤¤¤è¤¦¤Ë¤¹¤ë ÊýË¡¤È¤·¤Æ¡¤option ·¿¤òÍѤ¤¤ëÊýË¡¤¬¤¢¤ë¡¥

# let rec prod_list_aux = function
      [] -> Some 1
    | 0 :: _ -> None
    | n :: rest -> 
        (match prod_list_aux rest with None -> None | Some m -> Some (m * n));;
val prod_list_aux : int list -> int option = <fun>
# let prod_list l = match prod_list_aux l with None -> 0 | Some n -> n;;
val prod_list : int list -> int = <fun>
# prod_list [2; 3; 4];;
- : int = 24
# prod_list [4; 0; 2; 3; 4];;
- : int = 0

¤³¤³¤Ç¤Ï¡¤¥ê¥¹¥È¤Ë 0 ¤¬½Ð¸½¤·¤¿¤³¤È¤ò None ¤Çɽ¸½¤·¤Æ¤¤¤ë¡¥¤¿¤·¤«¤Ë¡¤ 0 ¤¬½Ð¸½¤·¤¿¤é¡¤»Ä¤ê¤Î¥ê¥¹¥È¤ÎÀѤò·×»»¤»¤º¤Ë½ªÎ»¤·¤Æ¤¤¤ë¤Î¤À¤¬¡¤ ¥×¥í¥°¥é¥àŪ¤Ë¤Ï¤¢¤Þ¤êÈþ¤·¤¯¤Ê¤¤¡¥¤³¤ì¤òÎã³°¤òÍøÍѤ·¤Æ¡¤ None ¤òÊÖ¤¹Âå¤ï¤ê¤ËÎã³°¤òȯÀ¸¤µ¤»¤ë¤è¤¦¤Ë¤·¤¿¤Î¤¬ºÇ¸å¤ÎÄêµÁ¤Ç¤¢¤ë¡¥

# exception Zero_found;;
exception Zero_found
# let rec prod_list_aux = function
      [] -> 1
    | 0 :: _ -> raise Zero_found
    | n :: rest -> n * prod_list_aux rest;;
val prod_list_aux : int list -> int = <fun>
# let prod_list l = try prod_list_aux l with Zero_found -> 0;;
val prod_list : int list -> int = <fun>
# prod_list_aux [2; 3; 4];;
- : int = 24
# prod_list_aux [4; 0; 2; 3; 4];;
Exception: Zero_found.
# prod_list [2; 3; 4];;
- : int = 24
# prod_list [4; 0; 2; 3; 4];;
- : int = 0

¤³¤Î¤è¤¦¤ËÎã³°¤ÏÂç°è¥¸¥ã¥ó¥×¤ËÁêÅö¤¹¤ë¤³¤È¤ò¼Â¸½¤¹¤ë¤³¤È¤¬¤Ç¤­¡¤¤¦¤Þ¤¯ »È¤¦¤È¥×¥í¥°¥é¥à¤ÎºÇŬ²½¡¤²ÄÆÉÀ­¤Î¸þ¾å¤Ë¤âÌò¤ËΩ¤ÄÈ¿ÌÌ¡¤ÍðÍѤ¹¤ë¤È¥×¥í ¥°¥é¥à¤ÎÀ©¸æ¤Îή¤ì¤¬Ê¬¤«¤ê¤Ë¤¯¤¯¤Ê¤ë´í¸±À­¤â¤¢¤ë¤Î¤ÇÃí°Õ¤·¤Æ»È¤ª¤¦¡¥

7.4  ¥Á¥ã¥Í¥ë¤ò»È¤Ã¤¿Æþ½ÐÎÏ

Objective Caml ¤Ë¤Ï¡¢ºÇ½é¤Ë¸«¤¿ print_string °Ê³°¤Ë¤âÍÍ¡¹¤ÊÆþ½ÐÎÏÍѤδؿô¤¬ÍÑ°Õ¤µ ¤ì¤Æ¤¤¤ë¡¥

ɸ½àÆþ½ÐÎÏ¡¤É¸½à¥¨¥é¡¼½ÐÎÏ´ØÏ¢¤Î´Ø¿ô

print_char, print_string, print_int, print_float, print_endline, print_newline ¤Ïɸ½à½ÐÎÏ(Ä̾ï¤ÏüËö²èÌÌ)¤Ë°ú¿ô¤ò½ñ¤­½Ð¤¹´Ø¿ô¤Ç¤¢¤ë¡¥ ¤½¤ì¤¾¤ì¡¤°ú¿ô¤Î·¿¤¬°Û¤Ê¤Ã¤¿¤ê¡¤ËöÈø¤Î²þ¹Ô¤Î½ÐÎϵ¡Ç½¤¬¤Ä¤¤¤Æ¤¤¤¿¤ê¤¹¤ë¤¬¡¤ ´ðËÜŪ¤ÊÆ°ºî¤ÏƱ¤¸¤Ç¤¢¤ë¡¥

print ¤ò prerr ¤ËÊѤ¨¤ì¤Ð¡¤É¸½à¥¨¥é¡¼½ÐÎϤ˽ñ¤­½Ð¤¹´Ø¿ô¤Ë¤Ê¤ë¡¥

¤Þ¤¿¡¤É¸½àÆþÎÏ(Ä̾ï¤Ï¥­¡¼¥Ü¡¼¥É)¤«¤éÆɤ߹þ¤ß¤ò¹Ô¤¦´Ø¿ô¤Ë¡¤read_line, read_int, read_float ¤¬¤¢¤ë¡¥

¥Õ¥¡¥¤¥ëÁàºî¤È¥Á¥ã¥Í¥ë

Objective Caml ¤Ç¤ÏÆþ½ÐÎÏÀè¤òɽ¸½¤¹¤ë¤Î¤Ë¥Á¥ã¥Í¥ë¤È¤¤¤¦Ãê¾ÝŪ¤Ê³µÇ°¤òÍѤ¤¤Æ¤¤¤ë¡¥ ¥Á¥ã¥Í¥ë¤ÏÄÌ¿®Ï©¤Î¤³¤È¤Ç¡¤¤³¤³¤Ë¸þ¤«¤Ã¤Æ½ñ¤­½Ð¤·¤¿¤ê¡¤¤³¤³¤«¤é Æɤ߹þ¤ß¤ò¹Ô¤¦¤³¤È¤Ç¡¤¤½¤ÎÀè¤Ë¤Ä¤Ê¤¬¤Ã¤¿²¿¤«(¥Õ¥¡¥¤¥ë¡¤¥Ç¥£¥¹¥×¥ì¥¤) ¤Ë½ñ¤­¹þ¤ó¤À¤ê¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥¥Á¥ã¥Í¥ë¤Ï¤µ¤é¤Ë¡¤ÆþÎÏÍÑ¡¤½ÐÎÏÍѤΠ¤â¤Î¤Ë¤ï¤«¤ì¤Æ¤ª¤ê¡¤Objective Caml ¤Ç¤Ï¤½¤ì¤¾¤ì¡¤in_channel ·¿¡¤out_channel ·¿ ¤È¤·¤ÆÄêµÁ¤µ¤ì¤Æ¤¤¤ë¡¥¤Þ¤¿¡¤É¸½àÆþÎϤʤɤÏÄêµÁºÑ¤ÎÃͤȤ·¤ÆÍÑ°Õ¤µ¤ì¤Æ¤¤¤ë¡¥

# (stdin, stdout, stderr);;
- : in_channel * out_channel * out_channel = (<abstr>, <abstr>, <abstr>)

¥Á¥ã¥Í¥ë¤ËÂФ¹¤ëÆþ½ÐÎϤˤϡ¤input_char, input_line, output_char, output_string ¤Ê¤É¤Î´Ø¿ô¤ÇÆɤ߽ñ¤­¤ò¹Ô¤¦¡¥

¤Þ¤¿¡¤¥Õ¥¡¥¤¥ë̾¤«¤é¿·¤¿¤Ê¥Á¥ã¥Í¥ë¤òÀ¸À®¤¹¤ë¤³¤È¤â¤Ç¤­¤ë¡¥ ½ÐÎÏÍѤΥÁ¥ã¥Í¥ë¤Ï open_out¡¤ÆþÎÏÍѤΥÁ¥ã¥Í¥ë¤Ï open_in ´Ø¿ô¤Ç ÆÀ¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥¤É¤Á¤é¤â¡¤¥Õ¥¡¥¤¥ë̾¤Îʸ»úÎó¤ò°ú¿ô¤È¤·¤Æ¼õ¤±¼è¤ë¡¥ ¤Þ¤¿¡¤»È¤¤½ª¤ï¤Ã¤¿¥Á¥ã¥Í¥ë¤Ï close_out, close_in ´Ø¿ô¤Ç ÊĤ¸¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥

¤½¤Î¾¤ÎÆþ½ÐÎÏ´Ø¿ô¤Ë¤Ä¤¤¤Æ¤Ï¡¤¥Þ¥Ë¥å¥¢¥ë¤Î 18 ¾Ï¤ò»²¾È¤µ¤ì¤¿¤¤¡¥

7.5  Objective Caml ¤Îʸˡ¤Ë¤Ä¤¤¤ÆÊä­

¤¤¤¯¤Ä¤«¡¤Ê¸Ë¡¤Ë¤Ä¤¤¤ÆÊä­¤·¤Æ¤ª¤¯¡¥°ÊÁ°¤Ë¸«¤¿¤è¤¦¤Ë±é»»»Ò¤Ë¤Ï Í¥Àè½ç°Ì¤¬¤Ä¤¤¤Æ¤¤¤Æ¶¯¤¤¤â¤Î¤«¤é·ë¹ç¤·Éôʬ¼°¤ò¹½À®¤¹¤ë¡¥ Î㤨¤Ð ; ¤Ï if ¤è¤ê¤â·ë¹ç¤¬¼å¤¤¤Î¤Ç¡¤

if false then print_string "a"; print_string "b";;

¤Ï

(if false then print_string "a"); print_string "b";;

¤ÈƱ¤¸°ÕÌ£¤Ç¤¢¤ë¡¥¤Þ¤¿¡¤

if false then print_string "a"; print_string "b" else ();;

¤Ïʸˡ¥¨¥é¡¼¤Ë¤Ê¤Ã¤Æ¤·¤Þ¤¦¡¥(; ¤Þ¤ÇÆɤó¤À»þÅÀ¤Ç if ¼°¤¬½ª¤ï¤Ã¤¿¤È ȽÃǤ·¤Æ¤·¤Þ¤¦¤¿¤á¤ÇÀè¤Ë¤¢¤ë else ¤Ï¤ß¤Æ¤¯¤ì¤Ê¤¤¡¥)

ʬ¤«¤ê¤Ë¤¯¤¤¤Î¤Ï¡¤if ¤Ê¤ÉÊ£¿ô¤Î¥­¡¼¥ï¡¼¥É¤«¤é¹½À®¤µ¤ì¡¤Æ±¤¸Í¥ÀèÅÙ¤ò »ý¤Ä¼°¤¬Æþ¤ì»Ò¤Ë¤Ê¤Ã¤¿¾ì¹ç¤Ç¤¢¤ë¡¥´ðËÜŪ¤Ë¤Ï Objective Caml ¤Îʸˡ¤Ç let, if, match, try, function, fun ¤Î¤è¤¦¤Ë¡¤½ªÃ¼¤ò¼¨¤¹¥­¡¼¥ï¡¼¥É ¤¬¤Ê¤¤¤â¤Î¤Ï¡¤¤Ç¤­¤ë¸Â¤êÀè¤Þ¤Ç´Þ¤á¤Æ¼°¤Î°ìÉô¤Ç¤¢¤ë¤è¤¦¤ËÆɤޤì¤ë¡¥Î㤨 ¤Ð¡¤

if a then if b then c else d

¤Ï

if a then (if b then c else d)

¤Î¤³¤È¤Ç¤¢¤ë¡¥Æ⦤Πif ¤¬±¦¤Ë¤Ç¤­¤ë¸Â¤ê¿­¤Ó¤è¤¦¤È¤·¤Æ¤¤¤ë¤Î¤¬¤ï¤«¤ë ¤À¤í¤¦¡¥

¤Þ¤¿¡¤match ¤ÎÆþ¤ì»Ò¡¤Îý½¬ÌäÂê¤Ë¤¢¤ë match ¤È try ¤ÎÁȹç¤ï¤»¤Ï Í×Ãí°Õ¤Ç¤¢¤ë¡¥

match e with
  A -> match e' with B -> ... | C -> ...
| D -> ...

¤Ï D ¤Îʬ´ô¤âÆ⦤Πmatch ¤Î°ìÉô¤È¤·¤Æ¹Í¤¨¤é¤ì¤Æ¤·¤Þ¤¦¤Î¤Ç¡¤ D ¤¬³°Â¦¤Î match ¤Ç¤¢¤ë¤è¤¦¤Ë¤¹¤ë¤Ë¤Ï°Ê²¼¤Î¤è¤¦¤Ë³ç¸Ì¤¬É¬ÍפǤ¢¤ë¡¥

match e with
  A -> (match e' with B -> ... | C -> ...)
| D -> ...

Îý½¬ÌäÂê¤Î try¼°¤â³ç¸Ì¤¬¤Ê¤¤¤ÈºÇ¸å¤Î | _ -> °Ê¹ß¤¬ try ¼°¤Î °ìÉô¤È¸«¤Ê¤µ¤ì¤Æ¤·¤Þ¤¦¤Î¤Ç¤¢¤ë¡¥

Âè4½µ¤ÎÍ¥Àè½ç°Ì¤Îɽ¤È¾å¤Î¥ë¡¼¥ë¤Ç¡¤°ì¸«¤·¤ÆÌÀ¤é¤«¤Ç¤Ê¤¤Éôʬ¼°¤Î·ë¹ç ¤Ï¤ï¤«¤ë¤Ï¤º¤Ç¤¢¤ë¡¥(¥×¥í¥°¥é¥à¤¬¸«¤Ë¤¯¤¯¤Ê¤é¤Ê¤¤ÄøÅ٤˳ç¸Ì¤ò¤Ä¤±¤ë¤Î ¤â¤è¤¤½¬´·¤Ç¤¢¤ë¡¥)

7.6  Îý½¬ÌäÂê

Exercise 1  ref ·¿¤ÎÃͤÎɽ¼¨¤ò¸«¤Æµ¤¤Å¤¤¤Æ¤¤¤ë¿Í¤â¤¤¤ë¤«¤â¤·¤ì¤Ê¤¤¤¬¡¤ref ·¿¤Ï °Ê²¼¤Î¤è¤¦¤ËÄêµÁ¤µ¤ì¤¿1¥Õ¥£¡¼¥ë¥É¤Î¹¹¿·²Äǽ¤Ê¥ì¥³¡¼¥É¤Ç¤¢¤ë¡¥
type 'a ref = { mutable contents : 'a };;
´Ø¿ô ref, Á°ÃÖ¥ª¥Ú¥ì¡¼¥¿ !¡¤ÃæÃÖ¥ª¥Ú¥ì¡¼¥¿ := ¤ÎÄêµÁ¤ò¡¤ ¥ì¥³¡¼¥É¤Ë´ØÏ¢¤·¤¿Áàºî¤Ç½ñ¤±¡¥
Exercise 2  Í¿¤¨¤é¤ì¤¿»²¾È¤Î»Ø¤¹Àè¤ÎÀ°¿ô¤ò1Áý¤ä¤¹´Ø¿ô incr ¤òÄêµÁ¤»¤è¡¥
# let x = ref 3;;
val x : int ref = contents = 3
# incr x;;
- : unit = ()
# !x;;
- : int = 4
Exercise 3  °Ê²¼¤ÇÄêµÁ¤¹¤ë funny_fact ¤ÏºÆµ¢ÅªÄêµÁ(rec)¤ò»È¤ï¤º¤Ë³¬¾è¤ò·×»»¤·¤Æ¤¤¤ë¡¥ ¤É¤Î¤è¤¦¤Ê»ÅÁȤߤǼ¸½¤µ¤ì¤Æ¤¤¤ë¤«ÀâÌÀ¤»¤è¡¥
# let f = ref (fun y -> y + 1)
  let funny_fact x = if x = 1 then 1 else x * (!f (x - 1));;
val f : (int -> int) ref = contents = <fun>
val funny_fact : int -> int = <fun>
# f := funny_fact;;
- : unit = ()
# funny_fact 5;;
- : int = 120
Exercise 4   »²¾È¤ò»È¤Ã¤Æ³¬¾è´Ø¿ô¤òÄêµÁ¤·¤Æ¤ß¤è¤¦¡¥...Éôʬ¤òËä¤á¤è¡¥

let fact_imp n =
  let i = ref n and res = ref 1 in
    while (...) do 
      ...;
      i := !i - 1
    done;
    ...;;
Exercise 5   ³¬¾è´Ø¿ô fact ¤òÉé¤Î°ú¿ô¤ËÂФ·¤Æ Invalid_argument ¤òȯÀ¸¤µ¤»¤ë¤è¤¦ ¤Ë²þÎɤ»¤è¡¥
Exercise 6  7.1.4 Àá¤Ç½Ò¤Ù¤¿ [] ¤Ø¤Î»²¾È¤ÎÎã¤ò¼ÂºÝ¤Ë¥¤¥ó¥¿¥é¥¯¥Æ¥£¥Ö¡¦¥³¥ó¥Ñ¥¤¥é¤Ç »î¤·¡¤¥Æ¥­¥¹¥È¤Ë½ñ¤¤¤¿µóÆ°¤È¤Î°ã¤¤¡¤Æäˡ¤»²¾È¤Î·¿¤òÀâÌÀ¤·¡¤¤É¤Î¤è¤¦¤Ë¤·¤Æ true ¤ò [1] ¤Ë cons ¤·¤Æ¤·¤Þ¤¦¤è¤¦¤Ê»öÂÖ¤ÎȯÀ¸¤¬Ëɤ¬¤ì¤Æ¤¤¤ë¤«ÀâÌÀ¤»¤è¡¥
Exercise 7  ¾å¤Ç¤ß¤¿¥ª¥Ö¥¸¥§¥¯¥È»Ø¸þÉ÷¥×¥í¥°¥é¥ß¥ó¥°¤Î±äĹ¤Ç·Ñ¾µ¤Ê¤É¤òɽ¸½¤·¤Æ¤ß¤è ¤¦¤È»×¤¦¡¥°Ê²¼¤Ï¿§¤òɽ¤¹·¿¤È¿§ÉÕ¤­ÅÀ¥ª¥Ö¥¸¥§¥¯¥È¤Î¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤Ç¤¢ ¤ë¡¥
# type color = Blue | Red | Green | White;;
type color = Blue | Red | Green | White
# type cpointI = {cget: unit -> int; 
                  cset: int -> unit;
                  cinc: unit->unit;
                  getcolor: unit-> color};;
type cpointI = 
cget : unit -> int;
cset : int -> unit;
cinc : unit -> unit;
getcolor : unit -> color;

¿§ÉÕ¤­ÅÀ¥ª¥Ö¥¸¥§¥¯¥È¤ÏºÂɸ¤Ë²Ã¤¨¡¤¿§¤ò¾õÂ֤Ȥ·¤Æ¤â¤Ä¤È¤¹¤ë¡¥ ¤Þ¤¿¡¤cget, cinc ¤Ï pointC ¤Î¥á¥½¥Ã¥É¤ò·Ñ¾µ¤·¡¤ cset ¤ÏºÂɸ¤Î¥»¥Ã¥È¤È¤È¤â¤Ë¿§¤òÇò¤Ë¥»¥Ã¥È¤¹¤ë¤è¤¦¤Ë¼ÂÁõ¤·¤¿¤¤¡¥ °Ê²¼¤¬¤½¤Î»î¤ß¤Ç¤¢¤ë¡¥
# let cpointC x col=
    let super = pointC x in
    let rec this =
      {cget=  super.get;
       cset=  (fun x -> super.set x; col := White);
       cinc= super.inc;
       getcolor = (fun () -> !col)} in
    this;;
val cpointC : int ref -> color ref -> cpointI = <fun>
# let new_cpoint x col = cpointC (ref x) (ref col);;
val new_cpoint : int -> color -> cpointI = <fun>
¤·¤«¤·¡¤¤³¤Î¼ÂÁõ¤Ï¤¦¤Þ¤¯Æ¯¤«¤Ê¤¤¡¥
# let cp = new_cpoint 0 Red;;
val cp : cpointI =
cget = <fun>; cset = <fun>; cinc = <fun>; getcolor = <fun>
# cp.cinc();;
- : unit = ()
# cp.cget();;
- : int = 1
# cp.getcolor();;
- : color = Red
cinc Ãæ¤Ç¤Ï¡¤ºÂɸ¤ò¥»¥Ã¥È¤¹¤ë¤Î¤Ç¿§¤ÏÇò¤Ë¤Ê¤Ã¤Æ¤¤¤Æ¤Û¤·¤¤¤Î¤Ë ¸µ¤Î¤Þ¤Þ¤Ç¤¢¤ë¡¥¤³¤ÎÍýͳ¤ò¥×¥í¥°¥é¥à¤ÎµóÆ°¤È¤È¤â¤ËÀâÌÀ¤·¡¤ ¤¦¤Þ¤¯ cinc ¤¬ºîÆ°¤¹¤ë¤è¤¦¤Ë¥×¥í¥°¥é¥à¤ò½ñ¤­´¹¤¨¤è¡¥¤¿¤À¤·¡¤ ·Ñ¾µ¤òÌÏÊ路¤¿¤¤¤Î¤Ç¡¤Æ±¤¸¤³¤È¤ò¤¹¤ë¥á¥½¥Ã¥É¤ËÁêÅö¤¹¤ë ´Ø¿ô¤Ï°ìÅÙ½ñ¤¯¤À¤±¤Ç(¾å¤Î super.get ¤Î¤è¤¦¤Ê·Á¤Ç)ºÆÍøÍѤ¹¤ë¤³¤È¡¥

(¥Ò¥ó¥È: pointC ¤ÎÄêµÁ¤ò°Ê²¼¤Î¤è¤¦¤ËÊѹ¹¤¹¤ë¡¥)

# let pointC x this () =
    {get=  (fun () -> !x); 
     set=  (fun newx -> x:=newx);
     inc= (fun () -> (this ()).set ((this ()).get () + 1))};;
val pointC : int ref -> (unit -> pointI) -> unit -> pointI = <fun>
# let new_point x = 
    let x = ref x in 
    let rec this () = pointC x this () in
    this ();;
val new_point : int -> pointI = <fun>
Exercise 8  °Ê²¼¤Î´Ø¿ô change ¤Ï¡¤¤ª¶â¤ò¡Ö¤¯¤º¤¹¡×´Ø¿ô¤Ç¤¢¤ë¡¥
# let rec change = function
      (_, 0) -> []
    | ((c :: rest) as coins, total) -> 
        if c > total then change (rest, total)
        else c :: change (coins, total - c);;
Warning P: this pattern-matching is not exhaustive.
Here is an example of a value that is not matched:
([], 1)
.................function
(_, 0) -> []
| ((c :: rest) as coins, total) -> 
if c > total then change (rest, total)
else c :: change (coins, total - c)..
val change : int list * int -> int list = <fun>
Í¿¤¨¤é¤ì¤¿(¹ß½ç¤Ë¤Ê¤é¤ó¤À)Ä̲ߤΥꥹ¥È coins ¤È¹ç·×¶â³Û total ¤«¤é ¥³¥¤¥ó¤Î¥ê¥¹¥È¤òÊÖ¤¹¡¥
# let us_coins = [25; 10; 5; 1]
  and gb_coins = [50; 20; 10; 5; 2; 1];;
val us_coins : int list = [25; 10; 5; 1]
val gb_coins : int list = [50; 20; 10; 5; 2; 1]
# change (gb_coins, 43);;
- : int list = [20; 20; 2; 1]
# change (us_coins, 43);;
- : int list = [25; 10; 5; 1; 1; 1]
¤·¤«¤·¡¤¤³¤ÎÄêµÁ¤ÏÀèƬ¤Ë¤¢¤ë¥³¥¤¥ó¤ò¤Ç¤­¤ë¸Â¤ê»È¤ª¤¦¤È¤¹¤ë¤¿¤á¡¤ ²Äǽ¤Ê¥³¥¤¥ó¤ÎÁȹç¤ï¤»¤¬¤¢¤ë¤È¤­¤Ë¤Ç¤â¼ºÇÔ¤·¤Æ¤·¤Þ¤¦¤³¤È¤¬¤¢¤ë¡¥
# change ([5; 2], 16);;
Exception: Match_failure ("", 201, 17).
¤³¤ì¤ò¡¤Îã³°½èÍý¤òÍѤ¤¤Æ²ò¤¬¤¢¤ë¾ì¹ç¤Ë¤Ï½ÐÎϤ¹¤ë¤è¤¦¤Ë¤·¤¿¤¤¡¥ °Ê²¼¤Î¥×¥í¥°¥é¥à¤Î¡¤2¸Ä½ê¤Î ... Éôʬ¤òËä¤á¡¤¥×¥í¥°¥é¥à¤ÎÀâÌÀ¤ò¹Ô¤¨¡¥
let rec change = function
    (_, 0) -> []
  | ((c :: rest) as coins, total) -> 
      if c > total then change (rest, total)
      else 
        (try 
          c :: change (coins, total - c) 
         with Failure "change" -> ...)
  | _ -> ...;;
Exercise 9  print_int ´Ø¿ô¤ò stdout, output_string ¤Ê¤É¤òÍѤ¤¤ÆÄêµÁ¤»¤è¡¥
Exercise 10   Æó¤Ä¤Î¥Õ¥¡¥¤¥ë̾¤ò°ú¿ô¤Ë¤È¤Ã¤Æ¡¤ÊÒÊý¤Î¥Õ¥¡¥¤¥ë¤ÎÆâÍƤò ¤â¤¦ÊÒÊý¤Ë¥³¥Ô¡¼¤¹¤ë´Ø¿ô cp ¤òÄêµÁ¤»¤è¡¥¤È¤¯¤Ë°ìÅÙ³«¤¤¤¿ ¥Õ¥¡¥¤¥ë¤ÏºÇ¸å¤ËÊĤ¸¤ë¤³¤È¤ò˺¤ì¤Ê¤¤¤è¤¦¤Ë¡¥

1
Objective Caml ¤Î¥ª¥Ö¥¸¥§¥¯¥È ¤Ï¥ì¥³¡¼¥É¤Ç¤Ï¤Ê¤¤¤Î¤Ç¡¤¤½¤Î¤è¤¦¤ÊÀ©¸Â¤Ï¤â¤Á¤í¤ó¤Ê¤¤

Previous Up Next