Previous Up Next

2  Objective Caml ÆþÌç

Ê̤ËÇÛÉÛ¤¹¤ë¥Æ¥­¥¹¥È¤ò»²¾È¤Î¤³¤È¡¥°Ê²¼¤Ï¡¤¥Æ¥­¥¹¥È¤«¤é¤Î Objective Caml ¸À¸ì¤Ë´Ø¤¹¤ëµ­½Ò¤Î°ìÉôÈ´¿è¤Ç¤¢¤ë¡¥

2.1  Objective Caml ¤È¤Ï

¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì ML ¤Ï¡¤¸µ¡¹¤Ï·×»»µ¡¤Ë¤è¤ë¾ÚÌÀ»Ù±ç·Ï¤«¤éȯŸ ¤·¤Æ¤­¤¿¸À¸ì1 ¤Ç¡¤´Ø¿ô·¿¥×¥í¥°¥é¥ß¥ó¥°¤È¸Æ¤Ð¤ì¤ë¥×¥í¥°¥é¥ß¥ó¥°¥¹¥¿¥¤¥ë¤ò¥µ¥Ý¡¼¥È¤·¤Æ ¤¤¤ë¡¥ML¤Ï³Ë¤È¤Ê¤ëÉôʬ¤¬¾®¤µ¤¯¥·¥ó¥×¥ë¤Ç¤¢¤ë¤¿¤á¡¤¥×¥í¥°¥é¥ß¥ó¥°½é¿´¼Ô ¸þ¤±¤Î¶µ°éÍѤËŬ¤·¤¿¸À¸ì¤Ç¤¢¤ë¡¥¤ÈƱ»þ¤Ë¡¤Â絬ÌϤʥ¢¥×¥ê¥±¡¼¥·¥ç¥ó³«È¯¤Î ¤¿¤á¤Î¥µ¥Ý¡¼¥È(¥â¥¸¥å¡¼¥ë¥·¥¹¥Æ¥à¡¦¥é¥¤¥Ö¥é¥ê)¤¬½¼¼Â¤·¤Æ¤¤¤ë¡¥ML¤Î³Ë¸À ¸ì¤Ï·¿ÉÕ¤­λ·×»»¤È¸Æ¤Ð¤ì¤ë¡¤·Á¼°Åª¤Ê·×»»¥â¥Ç¥ë¤Ë´ð¤Å¤¤¤Æ¤¤¤ë¡¥ ¤³¤Î¤³¤È¤Ï¡¤¸À¸ì»ÅÍͤò·Á¼°Åª¤Ë(¿ô³ØŪ¤Ê¸·Ì©¤Ê³µÇ°¤òÍѤ¤¤Æ)ÄêµÁ¤·¡¤¤½¤Î À­¼Á¤ò¸·Ì©¤Ë¡Ö¾ÚÌÀ¡×¤¹¤ë¤³¤È¤ò²Äǽ¤Ë¤·¤Æ¤¤¤ë¡¥¼ÂºÝ¡¤Standard ML ¤È¤¤¤¦ ¸À¸ì»ÅÍÍ[]¤Ë¤ª¤¤¤Æ¤Ï¡¤(¥³¥ó¥Ñ¥¤¥é¤Î¼õÍý¤¹¤ë)Àµ¤·¤¤¥×¥í¥°¥é ¥à¤Ï·è¤·¤Æ̤ÄêµÁ¤ÎÆ°ºî¤ò¤ª¤³¤µ¤Ê¤¤¡¤¤È¤¤¤Ã¤¿À­¼Á¤¬¾ÚÌÀ¤µ¤ì¤Æ¤¤¤ë¡¥

¤³¤Î¼Â¸³µÚ±é½¬¤Ç³Ø¤Ö¤Î¤Ï ML ¤ÎÊý¸À¤Ç¤¢¤ë Objective Caml ¤È¤¤¤¦¸À¸ì¤Ç¤¢¤ë¡¥ Objective Caml ¤Ï INRIA ¤È¤¤¤¦¥Õ¥é¥ó¥¹¤Î¹ñΩ¤Î·×»»µ¡²Ê³Ø¤Î¸¦µæ½ê¤Ç¥Ç¥¶¥¤¥ó¡¦³« ȯ¤µ¤ì¤¿¸À¸ì¤Ç¡¤Standard ML ¤È¤ÏʸˡŪ¤Ë¤Ï°ã¤Ã¤¿¸À¸ì¤Ç¤¢¤ë¤¬¡¤¤Û¤È¤ó¤É ¤Îµ¡Ç½¤Ï¶¦Í­¤·¤Æ¤¤¤ë¡¥¤Þ¤¿¡¤OCaml ¤Ç¤Ï Standard ML ¤Ë¤Ï¸«¤é¤ì¤Ê¤¤¡¤ÆÈ ¼«¤Î³ÈÄ¥¤¬Â¿¤¯»Ü¤µ¤ì¤Æ¤ª¤ê¡¤´Ø¿ô·¿¥×¥í¥°¥é¥ß¥ó¥°¤À¤±¤Ç¤Ê¤¯¡¤¥ª¥Ö¥¸¥§¥¯ ¥È»Ø¸þ¥×¥í¥°¥é¥ß¥ó¥°¤â¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¡¥¤Þ¤¿¥³¥ó¥Ñ¥¤¥é¤â¸úΨŪ¤Ê¥³¡¼ ¥É¤òÀ¸À®¤¹¤ëÍ¥¤ì¤¿¤â¤Î¤¬³«È¯¤µ¤ì¤Æ¤¤¤ë¡¥

2.2  Objective Caml ¸À¸ì¤ÎÊ·°Ïµ¤

Objective Caml ¸À¸ì¤Î³µÍפò¥×¥í¥°¥é¥àÎã¤òº®¤¸¤¨¤Æ¾Ò²ð¤¹¤ë¡¥¤³¤ì¤Ï Objective Caml ¤È¤¤¤¦¸À¸ì ¼«ÂΤÎÀâÌÀ¤À¤±¤Ç¤Ê¤¯¡¤¤³¤Î¼Â¸³¤ÇºîÀ®¤¹¤ë½èÍý·Ï¤ÎÆ°ºîÎã¤Ë¤â¤Ê¤Ã¤Æ¤¤¤ë¡¥

Objective Caml¤Ï¡¤¤¤¤ï¤æ¤ë´Ø¿ô·¿¸À¸ì¤Ç¤¢¤ë
·×»»¤Î»ÅÁÈ¤ß¤Ï Scheme ¤Ë»÷¤Æ¤¤¤Æ¡¤¼°¤òÃͤËɾ²Á¤¹¤ë¤³¤È¤Ç¥×¥í¥°¥é¥à¼Â¹Ô¤¬¿Ê¤à¡¥Î㤨¤Ð¡¤Scheme ¤Ç¤Ï¡¤
(define (fact n)
  (if (= n 0) 1 (* n (fact (- n 1)))))
(fact 5)
¤ÈÆþÎϤ¹¤ë¤È¡¤³¬¾è´Ø¿ô fact ¤¬ÄêµÁ¤µ¤ì¤Æ¡¤¼¡¤Î¼°¤ÎÆþÎϤˤè¤ê 120 ¤¬Ê֤äƤ¯¤ë¤¬¡¤Objective Caml¤Ç¤Ï°Ê²¼¤Î¤è¤¦¤Ë½ñ¤¯¡¥
let rec fact n = 
  if n = 0 then 1 else n * fact (n-1);;
fact 5;;
²¿¤È¤Ê¤¯Âбþ´Ø·¸¤¬¤ï¤«¤ë¤À¤í¤¦¤«¡¥
´Ø¿ô¤âÃͤǤ¢¤ë
¤â¤Á¤í¤ó¡¤Scheme ¤Î¤è¤¦¤Ë¡¤´Ø¿ô¤ò ÊÖ¤¹´Ø¿ô¤ä¡¤´Ø¿ô¤ò°ú¿ô¤Ë¼è¤ë´Ø¿ô¤Ê¤É¤â¼«Í³¤Ë»È¤¨¤ë¡¥Î㤨¤Ð¡¤°Ê²¼¤Ï Í¿¤¨¤é¤ì¤¿´Ø¿ô f ¤ÈÀ°¿ô n ¤«¤é ∑i=0n f(i) ¤ò·×»»¤¹¤ë´Ø¿ô¤Ç¤¢¤ë¡¥
let rec sum (f, n) =
  if n = 0 then f(n) else f(n) + sum (f, n-1);;
sum (fact, 5);;
¤È¤¹¤ë¤È¡¤0! + 1! + 2! + 3! + 4! + 5! ¤¬·×»»¤µ¤ì¤Æ¡¤154 ¤¬Ê֤äƤ¯¤ë¡¥
Objective Caml¤Ë¤ÏÀÅŪ·¿¤¬¤¢¤ê¡¤¶¯¤¯·¿ÉÕ¤±¤µ¤ì¤ë
Objective Caml¥×¥í¥°¥é¥à¤ËÂФ·¤Æ ¤Ï¼Â¹ÔÁ°¤Ë·¿¸¡ºº¤¬¹Ô¤ï¤ì¡¤±é»»»Ò¤Ê¤É¤Î¸í¤Ã¤¿»ÈÍѤ¬¤Ê¤¤¤«¤É¤¦¤«¤¬ ¸¡ºº¤µ¤ì¤ë¡¥·¿¤Î¹ç¤ï¤Ê¤¤·×»»¤ò¤µ¤»¤è¤¦¤È¤¹¤ë¤È¡¤ ¼Â¹Ô¤ò¤¹¤ëÁ°¤Ë(ÀÅŪ¤Ë)¥¨¥é¡¼¤¬È¯À¸¤·¤Æ¸í¤ê¤ò»ØŦ¤µ¤ì¤ë¡¥
let hoge x = x + 1 + "hoge";;
¤Ê¤É¤ÈÆþÎϤ¹¤ë¤È¡¤¤½¤Î»þÅÀ¤Ç¡¤hoge ¤ò¸Æ¤Ó½Ð¤·¤Æ¤â¤¤¤Ê¤¤¤Î¤Ë¡¤
This expression has type string but is here used with type int
¤Ä¤Þ¤ê¡¤"hoge" ¤È¤¤¤¦Ê¸»úÎ󤬡¤+ ¤È¤¤¤¦À°¿ô¤ò´üÂÔ¤·¤Æ¤¤¤ë±é»»»Ò¤Î °ú¿ô¤È¤·¤Æ»È¤ï¤ì¤Æ¤¤¤Þ¤¹¤è¡¤¤È¤¤¤¦°ÕÌ£¤Î¥á¥Ã¥»¡¼¥¸(¤³¤³¤Ç¤Ï¥·¥¹¥Æ¥à¤« ¤é¤ÎÊÖÅú¤òɽ¤¹¤¿¤á¤Ë¼ÐÂΤò»È¤Ã¤Æ¤¤¤ë)¤È¤È¤â¤Ë¥³¥ó¥Ñ¥¤¥ë¥¨¥é¡¼¤¬È¯À¸¤¹ ¤ë¡¥ (¼ÂºÝ¤Ï "hoge"¤Î²¼¤Ë²¼Àþ¤¬¤Ò¤«¤ì¤Æ¡¤ This expression ¤¬¤É¤ì¤Ê ¤Î¤«¤â¶µ¤¨¤Æ¤¯¤ì¤ë¡¥)¤³¤Î¥¨¥é¡¼¤Ï¡¤ hoge ¤ò¸Æ¤Ó½Ð¤·¤Æ¼ÂºÝ¤Ë­¤·»»¤¬ ¹Ô¤ï¤ì¤è¤¦¤È¤¹¤ëÁ°¤ËȯÀ¸¤¹¤ë¤Î¤¬¥ß¥½¤Ç¤¢¤ë¡¥¤Þ¤¿¡¤Objective Caml¤Ç¤Ï¡¤·¿¸¡ºº ¤òÄ̲ᤷ¤¿¾ì¹ç¤Ë¤Ï¡¤Ê¸»úÎó¤ÈÀ°¿ô¤Î­¤·»»¤Î¤è¤¦¤Ê¥¨¥é¡¼¤¬¼Â¹Ô»þ¤ËȯÀ¸¤· ¤Ê¤¤¤³¤È¤¬¡¤(¿ô³ØŪ¤Ë)Êݾڤµ¤ì¤Æ¤¤¤ë¡¥¤³¤Î¤³¤È¤ò Objective Caml ¤Ï¶¯ ¤¯·¿ÉÕ¤±¤µ¤ì¤¿(strongly typed)¸À¸ì¤Ç¤¢¤ë¡¤¤È¤¤¤¦¡¥
Objective Caml¤Ï·¿¿äÏÀ¤ò¤·¤Æ¤¯¤ì¤ë
C¸À¸ì¤Ë¤âÀÅŪ·¿¤¬¤¢¤ë¤¬¡¤ ´Ø¿ôÀë¸À¤ÎºÝ¤Ë¡¤²¾°ú¿ô¤Î·¿¤òÀë¸À¤¹¤ëɬÍפ¬¤¢¤ë¡¥¤³¤ì¤ËÂФ·¤Æ Objective Caml¤Ç¤Ï¾å¤ÎÎ㤫¤é¤â¸«¤Æ¤È¤ì¤ë¤è¤¦¤Ë¡¤°ú¿ô¤Î·¿¤äÊÖ¤êÃͤη¿ ¤ò¤¤¤Á¤¤¤Á½ñ¤«¤Ê¤¯¤Æ¤â¡¤¥·¥¹¥Æ¥à¤¬¿äÏÀ¤ò¤·¤Æ¤¯¤ì¤ë¡¥Î㤨¤Ð¡¤
let rec fact n = 
  if n = 0 then 1 else n * fact (n-1);;
¤È¤¹¤ë¤È¡¤¥·¥¹¥Æ¥à¤«¤é¤Ï¡¤
val fact : int -> int = <fun>
¤È¤¤¤¦È¿±þ¤¬Ê֤äƤ¯¤ë¡¥¤³¤ì¤Ï fact ¤¬À°¿ô(int)¤ò¼õ¤±¼è¤Ã¤Æ¡¤ À°¿ô¤òÊÖ¤¹´Ø¿ô(->)¤À¤È¤¤¤¦¤³¤È¤ò¼¨¤·¤Æ¤¤¤ë¡¥
Objective Caml¤Ë¤Ï¥Ñ¥¿¡¼¥ó¥Þ¥Ã¥Áµ¡Ç½¤¬¤¢¤ë

Objective Caml ¤Ë¤Ï¡¤¥Ñ¥¿¡¼¥ó¥Þ¥Ã¥Á¤È¤¤¤¦µ¡Ç½¤¬¤¢¤Ã¤Æ¡¤¥ê¥¹¥È¤Ê¤É ¹½Â¤¤Î¤¢¤ëÃͤËÂФ·¤Æ¡¤¥Ñ¥¿¡¼¥ó¤òÅö¤Æ¤Ï¤á¤Æ¡¤ÃͤΰìÉô¤ò¼è¤ê¤À¤¹¤³¤È ¤¬¤Ç¤­¤ë¡¥Objective Caml ¤Ç¤Ï¡¤¥ê¥¹¥È¤ò [] (¶õ¥ê¥¹¥È)¡¤:: (cons) ¤ò»È¤Ã¤Æ¡¤ 1 :: 2 :: 3 :: [] ¤Î¤è¤¦¤Ë½ñ¤¯¤Î¤À¤¬2¡¤À°¿ô¥ê¥¹¥È¤ÎÀèƬ2Í×ÁǤޤǤÎϤò·×»» ¤¹¤ë´Ø¿ô sum_of_first_two ¤Ï¡¤¥Ñ¥¿¡¼¥ó¥Þ¥Ã¥Á¤ò»È¤¦¤È

let sum_of_first_two l =
  match l with
     [] -> 0
   | x :: [] -> x
   | x :: y :: rest -> x + y;;
val sum_of_first_two : int list -> int = <fun>

¤È½ñ¤±¤ë¡¥ match ¤Ï´Ø¿ô¤Î°ú¿ô l ¤ËÂФ·¤Æ¡¤[] (¶õ¥ê¥¹¥È¥Ñ¥¿¡¼¥ó)¤ä x::[] (1Í×Áǥѥ¿¡¼¥ó) ¤ä x::y::rest (2Í×Áǰʾå¥Ñ¥¿¡¼¥ó) ¤òÅö¤Æ¤Ï¤á¤Æ¡¤ Åö¤Æ¤Ï¤Þ¤Ã¤¿¤é¡¤ÊÑ¿ô x (¤ä y) ¤ò¥ê¥¹¥È¤ÎÍ×ÁǤȤ·¤Æ¡¤·×»»¤ò¹Ô¤¦¡¥¥Ñ¥¿¡¼¥ó¥Þ¥Ã¥Á¤ò»È¤¦¤È¡¤¾ò·ïʬ´ô¤òÊ£ »¨¤ËÆþ¤ì»Ò¤Ë¤¹¤ë¤³¤È¤Ê¤¯¡¤Á´¤Æ¤Î¾ì¹ç¤¬°ìÅ٤˽ñ¤­²¼¤»¤ë¤Î¤¬Ì¥ÎϤǤ¢¤ë¡¥ ¤Á¤Ê¤ß¤Ë¡¤·¿¤Ë¸½¤ì¤ë -> ¤Îº¸Â¦¤Î int list¤ÏÀ°¿ô¤¬Ê¤ó¤À¥ê¥¹¥È ¤¬°ú ¿ô¤È¤·¤Æ¤È¤ì¤ë¤³¤È¤ò¼¨¤·¤Æ¤¤¤ë¡¥

Objective Caml ¤Î·¿¤Ï¿ÁêŪ
¿ÁêŪ¡¤¤È¤¤¤¦¤Î¤Ï¡¤¤Ò¤È¤Ä¤Î¥×¥í¥°¥é¥à¤Î ·¿¤¬¤¤¤í¤¤¤íÊѲ½¤¹¤ë¤³¤È¤ò¼¨¤·¤Æ¤¤¤ë¡¥Î㤨¤Ð¡¤°Ê²¼¤Ï¡¤¥ê¥¹¥È¤ÎŤµ¤ò·×»»¤¹¤ë´Ø¿ô¤Ç¤¢¤ë¤¬¡¤
let rec length list =
  match list with
     [] -> 0
   | x::rest -> 1 + length rest;;
¤³¤ì¤Ï¡¤À°¿ô¤Î¥ê¥¹¥È¤Ë»È¤¦¤³¤È¤â¤Ç¤­¤ë¤·¡¤Ê¸»úÎó¤Î¥ê¥¹¥È¤Ë»È¤¦¤³¤È¤â¤Ç¤­¤ë¡¥
length (2::3::4::[]);;
- : int = 3
length ("hoge"::"foo"::"bar"::"baz"::[]);;
- : int = 4
¤Ä¤Þ¤ê¡¤¤Ò¤È¤Ä¤Î´Ø¿ô length ¤ò¡¤¡ÖÀ°¿ô¥ê¥¹¥È¤ò¼õ¤±¤È¤Ã¤ÆÀ°¿ô¤òÊÖ¤¹¡× ´Ø¿ô¤ä¡Öʸ»úÎó¥ê¥¹¥È¤ò¼õ¤±¤È¤Ã¤ÆÀ°¿ô¤òÊÖ¤¹¡×´Ø¿ô¤È¤¤¤¦Ê̤η¿¤Î¤â¤Î¤È¤·¤Æ »È¤¨¤ë¡¥¥½¡¼¥Æ¥£¥ó¥°´Ø¿ô¤Ê¤É¤â¡¤À°¿ô¤Î¥½¡¼¥Æ¥£¥ó¥°¡¤Ê¸»úÎó¤Î¥½¡¼¥Æ¥£¥ó¥°¤Ê¤É °Û¤Ê¤ë¼ïÎà¤Î¥Ç¡¼¥¿¤ËÂФ¹¤ë¥½¡¼¥Æ¥£¥ó¥°¤ò¡¤¤Ò¤È¤Ä¤ÎÄêµÁ¤Çµ­½Ò¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥ ¤³¤Î¤è¤¦¤Ê¥×¥í¥°¥é¥ß¥ó¥°¤ò¡¤·¿¤¬Â¿ÁêŪ¤Ç¤Ê¤¤ C ¸À¸ì¤Ê¤É¤Ç(°ÂÁ´À­¤ò»¤Ê¤ï¤Ê¤¤¤Ç)¹Ô¤¦¤Î¤ÏÆñ¤·¤¤¡¥
¤½¤Î¾¤ÎÆÃħ
Scheme ¤ÈƱÍÍ¡¤¤´¤ß½¸¤á(garbage collection)¤Ë¤è¤ê¡¤¼«Æ°¥á¥â¥ê´ÉÍý¤¬¹Ô¤ï¤ì¤ë¤¿¤á¡¤¥×¥í¥°¥é¥Þ¤Ï C ¸À¸ì¤Î malloc/free ¤Ê¤É¤ò»È¤Ã¤¿¥á¥â¥ê´ÉÍý¤Î¤è¤¦¤Ë Ƭ¤òǺ¤Þ¤»¤ëɬÍפ¬¤Ê¤¤¡¥¤Þ¤¿¡¤ÂÐÏÃŪ¤Ë¥×¥í¥°¥é¥à³«È¯¤¬¤Ç¤­¤ë¥¤¥ó¥¿¥é¥¯¥Æ¥£¥Ö¡¦¥³¥ó¥Ñ¥¤¥é¤È¡¤ ¥½¡¼¥¹¥³¡¼¥É¤ò°ì³ç¤·¤Æ¼Â¹Ô·Á¼°¤ËÊÑ´¹¤¹¤ë¥Ð¥Ã¥Á¡¦¥³¥ó¥Ñ¥¤¥é¤¬ÍøÍѤǤ­¤ë¡¥

Previous Up Next