ËܾϤÏ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 () ¤ÎÊÖ¤¹ÃÍ¤Ï ÊѤäƤ¤¤¯¡¥¤½¤Î¤¿¤á¡¤ÉûºîÍѤòȼ¤¦¼°¤Ë¤Ä¤¤¤Æ¤Ï¡¤¤¤¤Äɾ²Á¤µ¤ì¤ë¤«¤ò ¾ï¤ËƬ¤Ë¤¤¤ì¤Æ¥×¥í¥°¥é¥à¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¤³¤³¤Þ¤Ç¸«¤¿¥×¥í¥°¥é¥à¤Ç¤Ï°ìÅÙºîÀ®¤·¤¿¥Ç¡¼¥¿¤ò¹¹¿·¤¹¤ë¼êÃʤÏÍ¿¤¨¤é¤ì¤Æ¤¤¤Ê ¤¤¡¥Objective Caml ¤Ë¤Ï¤¤¤¯¤Ä¤«¤Î¹¹¿·²Äǽ¤Ê¥Ç¡¼¥¿¹½Â¤¤¬ÍѰդµ¤ì¤Æ¤¤¤ë¡¥»²¾È(references)¡¤¹¹¿·²Äǽ¥ì¥³¡¼¥É(mutable records)¡¤ÇÛÎó(array)¤Ç¤¢¤ë¡¥
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)
¤³¤ì¤Þ¤Ç¤ß¤¿¥ì¥³¡¼¥É¤Ç¤Ï¥Õ¥£¡¼¥ë¥É¤ÎÃͤϹ¹¿·¤Ç¤¤Ê¤«¤Ã¤¿¡¥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"
ÇÛÎó¤ÏƱ¤¸¼ïÎà¤ÎÃͤν¸¹ç¤òɽ¤¹¥Ç¡¼¥¿¤È¤¤¤¦°ÕÌ£¤Ç¤Ï¥ê¥¹¥È¤È»÷Ä̤äƤ¤¤ë¤¬¡¤ Ťµ¤ÏÀ¸À®»þ¤Ë¸ÇÄê¤Ç¤¢¤ê¡¤¤É¤ÎÍ×ÁǤˤâľÀÜ(ÀèÆ¬¤«¤é½ç¤Ëé¤ë¤³¤È¤Ê¤¯)¥¢¥¯¥» ¥¹¤Ç¤¤ë¡¥¤Þ¤¿¡¤³ÆÍ×ÁǤò¹¹¿·¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡¥ÇÛÎó¤Ë¤Ï¡¤Í×ÁÇ·¿¤ò t ¤È¤· ¤Æ t array ¤È¤¤¤¦·¿¤¬Í¿¤¨¤é¤ì¤ë¡¥ÇÛÎó¤ÎÀ¸À®¡¤Í×ÁǤλ²¾È¡¤¹¹¿·¤Ï¤½¤ì¤¾¤ì¡¤
[|⟨ ¼°1 ⟩; ⟨ ¼°2 ⟩; …; ⟨ ¼°n ⟩|] ⟨ ¼°1 ⟩.(⟨ ¼°2 ⟩) ⟨ ¼°1 ⟩.(⟨ ¼°2 ⟩) <- ⟨ ¼°3 ⟩
¤È¤¤¤¦·Á¤Ç¹Ô¤¤¡¤n Í×ÁǤÎÇÛÎó¤Ç½é´üÃͤ¬¤½¤ì¤¾¤ì ⟨ ¼°i ⟩¤Ç¤¢¤ë ¤â¤Î¡¤ÇÛÎó⟨ ¼°1 ⟩¤Î ⟨ ¼°2 ⟩ÈÖÌܤÎÍ×ÁÇ¡¤ ÇÛÎó⟨ ¼°1 ⟩¤Î⟨ ¼°2 ⟩ÈÖÌܤÎÍ×ÁǤò⟨ ¼°3 ⟩¤Ç ¹¹¿·¡¤¤È¤¤¤¦°ÕÌ£¤Ç¤¢¤ë¡¥ÇÛÎó¤ÎÂ礤µ¤ò±Û¤¨¤¿À°¿ô¤ÇÍ×ÁǤ˥¢¥¯¥»¥¹¤¹¤ë¤È Invalid_argument ¤È¤¤¤¦Îã³°¤¬È¯À¸¤¹¤ë¡¥
Âè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 ¤ÎȯÌÀ°ÊÍ衤ÃÍ¿Áê¤Ë¸Â¤é¤º¤¤¤í¤¤¤í¤Ê²ò·èºö¤¬ µÄÏÀ¤µ¤ì¤Æ¤¤Æ¤¤¤ë¤¬¡¤Ì¤¤À¤Ë³§¤¬Ç¼ÆÀ¤¹¤ë¤â¤Î¤ÏÆÀ¤é¤ì¤Æ¤¤¤Ê¤¤¡¥
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¤Î¤Ç¡¤Ê̤Υ᥽¥Ã¥É̾¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¡¤ÈÑ»¨¤Ë¤Ê¤Ã¤Æ¤¯¤ë¡¥
ºÇ½é¤ÎÀâÌÀ¤Ç¤â¿¨¤ì¤¿¤è¤¦¤Ë¡¤ÉûºîÍѤòȼ¤¦·×»»¤Ï¡¤ÉûºîÍѤε¯¤³¤ë½çÈ֤˵¤¤ò¤Ä¤± ¤Æ¥×¥í¥°¥é¥ß¥ó¥°¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥Î㤨¤Ð¡¤°Ê²¼¤Î¤è¤¦¤Ê¥×¥í¥°¥é¥à
# 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 ´Ø¿ô¤Ï°ú¿ô¤Îʸ»úÎó¤Ë²þ¹Ô¤ò¤Ä¤±¤Æ½ÐÎϤ¹¤ë¤¿¤á¤Î ´Ø¿ô¤Ç¤¢¤ë¡¥
Îã³°(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 ¤Ç¤Ï¡¢¥×¥í¥°¥é¥Þ¤¬¿·¤·¤¤Îã³°¤òÀë¸À¡¢¤½¤ÎÎã³°¤òȯÀ¸¤µ¤»¤ë¤³¤È¤¬¤Ç ¤¤ë¡£¤Þ¤¿¡¢Îã³°¤ÎȯÀ¸¤ò¥×¥í¥°¥é¥àÃæ¤Ç¸¡ÃΤ·¡¢ÃæÃǤµ¤ì¤ëÁ°¤Ë½èÍý¤òºÆ³« ¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡£
¿·¤·¤¤Îã³°¤ÎÀë¸À¤Ï 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".
¼°¤Îɾ²ÁÃæ¤Ëµ¯¤³¤ëÎã³°¤Ï¡¢¤½¤Î¼ïÎब¤ï¤«¤ë¾ì¹ç¤Ë¤Ï¡¢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
¤³¤Î¤è¤¦¤ËÎã³°¤ÏÂç°è¥¸¥ã¥ó¥×¤ËÁêÅö¤¹¤ë¤³¤È¤ò¼Â¸½¤¹¤ë¤³¤È¤¬¤Ç¤¡¤¤¦¤Þ¤¯ »È¤¦¤È¥×¥í¥°¥é¥à¤ÎºÇŬ²½¡¤²ÄÆÉÀ¤Î¸þ¾å¤Ë¤âÌò¤ËΩ¤ÄÈ¿ÌÌ¡¤ÍðÍѤ¹¤ë¤È¥×¥í ¥°¥é¥à¤ÎÀ©¸æ¤Îή¤ì¤¬Ê¬¤«¤ê¤Ë¤¯¤¯¤Ê¤ë´í¸±À¤â¤¢¤ë¤Î¤ÇÃí°Õ¤·¤Æ»È¤ª¤¦¡¥
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 ¾Ï¤ò»²¾È¤µ¤ì¤¿¤¤¡¥
¤¤¤¯¤Ä¤«¡¤Ê¸Ë¡¤Ë¤Ä¤¤¤ÆÊ䤷¤Æ¤ª¤¯¡¥°ÊÁ°¤Ë¸«¤¿¤è¤¦¤Ë±é»»»Ò¤Ë¤Ï Í¥Àè½ç°Ì¤¬¤Ä¤¤¤Æ¤¤¤Æ¶¯¤¤¤â¤Î¤«¤é·ë¹ç¤·Éôʬ¼°¤ò¹½À®¤¹¤ë¡¥ Î㤨¤Ð ; ¤Ï 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½µ¤ÎÍ¥Àè½ç°Ì¤Îɽ¤È¾å¤Î¥ë¡¼¥ë¤Ç¡¤°ì¸«¤·¤ÆÌÀ¤é¤«¤Ç¤Ê¤¤Éôʬ¼°¤Î·ë¹ç ¤Ï¤ï¤«¤ë¤Ï¤º¤Ç¤¢¤ë¡¥(¥×¥í¥°¥é¥à¤¬¸«¤Ë¤¯¤¯¤Ê¤é¤Ê¤¤ÄøÅ٤˳ç¸Ì¤ò¤Ä¤±¤ë¤Î ¤â¤è¤¤½¬´·¤Ç¤¢¤ë¡¥)
type 'a ref = { mutable contents : 'a };;´Ø¿ô ref, Á°ÃÖ¥ª¥Ú¥ì¡¼¥¿ !¡¤ÃæÃÖ¥ª¥Ú¥ì¡¼¥¿ := ¤ÎÄêµÁ¤ò¡¤ ¥ì¥³¡¼¥É¤Ë´ØÏ¢¤·¤¿Áàºî¤Ç½ñ¤±¡¥
# let x = ref 3;; val x : int ref = contents = 3 # incr x;; - : unit = () # !x;; - : int = 4
# 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
let fact_imp n = let i = ref n and res = ref 1 in while (...) do ...; i := !i - 1 done; ...;;
# 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 = Redcinc Ãæ¤Ç¤Ï¡¤ºÂɸ¤ò¥»¥Ã¥È¤¹¤ë¤Î¤Ç¿§¤ÏÇò¤Ë¤Ê¤Ã¤Æ¤¤¤Æ¤Û¤·¤¤¤Î¤Ë ¸µ¤Î¤Þ¤Þ¤Ç¤¢¤ë¡¥¤³¤ÎÍýͳ¤ò¥×¥í¥°¥é¥à¤Îµóư¤È¤È¤â¤ËÀâÌÀ¤·¡¤ ¤¦¤Þ¤¯ 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>
# 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" -> ...) | _ -> ...;;