Previous Up Next

Chapter 4  ¹â³¬´Ø¿ô¡¤Â¿ÁêÀ­¡¤Â¿ÁêŪ´Ø¿ô

¤³¤Î¾Ï¤Î¥­¡¼¥ï¡¼¥É: ¹â³¬´Ø¿ô¡¤Â¿ÁêÀ­¡¤Â¿ÁêŪ´Ø¿ô¡¤·¿¿äÏÀ

4.1  ¹â³¬´Ø¿ô

Objective Caml ¤ò»Ï¤á¤È¤¹¤ë´Ø¿ô·¿¸À¸ì¤Ç¤Ï¡¤´Ø¿ô¤òÀ°¿ô¡¦Ê¸»úÎó¤Ê¤É¤Î¥Ç¡¼¥¿¤È Ʊ¤¸¤è¤¦¤Ë°·¤¦¤³¤È¤¬¤Ç¤­¤ë¡¥¤¹¤Ê¤ï¤Á¡¤¤¢¤ë´Ø¿ô¤ò¡¤ ¾¤Î´Ø¿ô¤Ø¤Î°ú¿ô¤È¤·¤ÆÅϤ·¤¿¤ê¡¤ÁȤʤɤΥǡ¼¥¿¹½Â¤¤Ë ³ÊǼ¤·¤¿¤ê¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥¤³¤Î¤³¤È¤ò¡ÖObjective Caml ¤Ç¤Ï´Ø¿ô¤ÏÂè°ìµé¤ÎÃÍ(first-class value)¤Ç¤¢¤ë¡×¤È¤¤¤¤¡¤¤Þ¤¿´Ø¿ô¤ò°ú¿ô/ÊÖ¤êÃͤȤ¹¤ë ¤è¤¦¤Ê´Ø¿ô¤ò¹â³¬´Ø¿ô(higher-order function)¤È¸Æ¤Ö¡¥

4.1.1  ´Ø¿ô¤ò°ú¿ô¤È¤¹¤ë´Ø¿ô

¤Þ¤º¡¤Á°¾Ï¤ÎÉü½¬¤ò¤«¤Í¤Æ¡¤12 + 2 2 + ⋯ + n2 ¤ò·×»»¤¹¤ë ´Ø¿ô sqsum ¤È¡¤13 + 2 3 + ⋯ + n3 ¤ò·×»»¤¹¤ë ´Ø¿ô cbsum ¤òÄêµÁ¤·¤Æ¤ß¤è¤¦¡¥
# let rec sqsum n =
#   if n = 0 then 0 else n * n + sqsum (n - 1)
# let rec cbsum n =
#   if n = 0 then 0 else n * n * n + cbsum (n - 1);;
val sqsum : int -> int = <fun>
val cbsum : int -> int = <fun>
¤è¤¯´Ñ»¡¤¹¤ë¤Þ¤Ç¤â¤Ê¤¯¡¤¤³¤ÎÆó¤Ä¤Î´Ø¿ô¤ÎÄêµÁ¤Ï¹ó»÷¤·¤Æ¤¤¤ë¤³¤È¤¬ ¤ï¤«¤ë¤À¤í¤¦¡¥¥×¥í¥°¥é¥ß¥ó¥°¤Î½ÅÍפʺî¶È¤Î°ì¤Ä¤Ï¡¤ Îà»÷¤Î·×»»¼ê½ç¤ò´Ø¿ô¤Ë¤è¤Ã¤Æ¶¦Í­¤¹¤ë¤³¤È¤Ç¤¢¤ë¡¥ ¤³¤ÎÆó¤Ä¤Î´Ø¿ô¤Î¶¦ÄÌÉôʬ¤òµÛ¼ý¤¹¤ë¤è¤¦¤Ê´Ø¿ô¤òÄêµÁ¤Ç¤­¤Ê¤¤¤À¤í¤¦¤«¡¥

¤³¤Î¤Õ¤¿¤Ä¤Î´Ø¿ô¤Î»÷¤Æ¤¤¤ëÅÀ¤Ï¡¤(1) n ¤¬ 0 ¤Ê¤é¤Ð 0 ¤òÊÖ¤¹¤³¤È¡¤ (2)ºÆµ¢¸Æ½Ð¤·¤Î·ë²Ì¤È n ¤Ë´Ø¤¹¤ë·×»»·ë²Ì¤ÎϤ¬¤È¤é¤ì¤Æ¤¤¤ë¤³¤È¡¤¤ÎÆó ÅÀ¤Ç¡¤°ã¤¤¤Ï n ¤Ë´Ø¤¹¤ë·×»»¼ê½ç¤À¤±¤Ç¤¢¤ë¡¥¤³¤Î¡Ö·×»»¼ê½ç¡×¤È¤¤¤¦º¹ °Û¤ò¥Ñ¥é¥á¡¼¥¿¤È¤·¤Æɽ¸½¤¹¤ë¤Ë¤Ï¤É¤¦¤¹¤ì¤Ð¤è¤¤¤À¤í¤¦¤«¡©¤â¤È¤â¤È·×»»¼ê ½ç¤òÃê¾Ý²½¤·¤¿¤â¤Î¤¬´Ø¿ô¤Ç¤¢¤ë¤Î¤Ç¡¤¡Ö´Ø¿ô¤ò¥Ñ¥é¥á¡¼¥¿¤È¤¹¤ë´Ø¿ô¡×¤òÄê µÁ¤¹¤ì¤Ð¤è¤µ¤½¤¦¤Ç¤¢¤ë¡¥¤½¤ì¤òÁÇľ¤Ëɽ¸½¤·¤¿¤Î¤¬°Ê²¼¤ÎÄêµÁ¤Ç¤¢¤ë¡¥
# let rec sigma (f, n) =
#   if n = 0 then 0 else f n + sigma (f, n-1);;
val sigma : (int -> int) * int -> int = <fun>
¤³¤Î´Ø¿ô sigma ¤Ï·¿¤¬¼¨¤·¤Æ¤¤¤ë¤è¤¦¤Ë¡¤À°¿ô¾å¤Î´Ø¿ô f ¤ÈÀ°¿ô n ¤ÎÁȤò ¼õ¤±¼è¤Ã¤Æ¡¤À°¿ô¤òÊÖ¤¹¡¥(·¿¤ÎÆɤßÊý: ·¿¹½ÃÛ»Ò * ¤È -> ¤Ï * ¤ÎÊý¤¬Í¥Àè ÅÙ¤¬¹â¤¤¡¥) ¤³¤ì¤ò»È¤Ã¤Æ¡¤sqsum ¤È cbsum ¤Ï¡¤
# let square x = x * x
# let sqsum n = sigma (square, n)
# let cbsum n = 
#   let cube x = x * x * x in sigma (cube, n);;
val square : int -> int = <fun>
val sqsum : int -> int = <fun>
val cbsum : int -> int = <fun>
¤ÈÄêµÁ¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥¹â³¬´Ø¿ô¤ËÅϤ¹¤À¤±¤ÎÊä½õŪ¤Ê´Ø¿ô¤Ï¡¤ ¾¤ÇɬÍפʤ¤¾ì¹ç¤Ï¡¤cbsum ¤ÎÎã¤Î¤è¤¦¤Ë let-¼°¤Ç¶É½ê«Çû¤ò ¹Ô¤¦¤«¡¤¼¡Àá¤ÇÀâÌÀ¤¹¤ëƿ̾´Ø¿ô¤ò»È¤¦¤Î¤¬¤è¤¤¤À¤í¤¦¡¥
# sqsum 5;;
- : int = 55
# cbsum 5;;
- : int = 225

4.1.2  Æ¿Ì¾´Ø¿ô

¤µ¤Æ¡¤´Ø¿ô sigma ¤Ï¡¤Σi=0n f(i) ¤Î¤è¤¦¤Ê·× »»¤ò°Û¤Ê¤ë f ¤Ë¤Ä¤¤¤Æ¹Ô¤¤¤¿¤¤¾ì¹ç¤ËÊØÍø¤Ç¤¢¤ë¡¥¤·¤«¤·¡¤¤³¤ì¤Þ¤Ç¤Ë ¤ß¤¿´Ø¿ô¤Ï let ¤òÍѤ¤¤ÆÄêµÁ¤¹¤ë¤·¤«¤Ê¤¯¡¤¶ñÂÎŪ¤Ê´Ø¿ô f ¤Ò¤È¤Ä¤Ò ¤È¤Ä¤Ë¤Ä¤¤¤Æ¡¤¿·¤·¤¤Ì¾Á°¤ò¤Ä¤±¤ÆÄêµÁ¤ò¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¤¤È¤¤¤¦¤ä¤äÌÌ Åݤʼê½ç1¤òƧ¤Þ¤Ê ¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥

´Ø¿ô·¿¸À¸ì¤Ç¤Ï¡¤Ì¾Á°¤Î¤Ê¤¤´Ø¿ô¡¤Æ¿Ì¾´Ø¿ô(anonymous function) ¤ò°·¤¦¼êÃʤ¬¤¿¤¤¤Æ¤¤ÍÑ°Õ¤µ¤ì¤Æ¤¤¤Æ¡¤Objective Caml ¤â¤½¤ÎÎã³°¤Ç¤Ï¤Ê¤¤¡¥Objective Caml ¤Ç¤Ï ƿ̾´Ø¿ô¤Ï
fun ⟨ ¥Ñ¥¿¡¼¥ó ⟩ -> e
¤È¤¤¤¦·Á¤ò¤È¤ê¡¤⟨ ¥Ñ¥¿¡¼¥ó ⟩¤Çɽ¤µ¤ì¤ë°ú¿ô¤ò¼õ¤±¼è¤ê¼° e ¤ò·×»»¤¹¤ë¡¥¤³¤Î¡Öfun ¼°¡×¤Ï´Ø¿ô¤¬É¬Íפʾì½ê¤É¤³¤Ë¤Ç¤â»ÈÍѤ¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
# let cbsum n = sigma ((fun x -> x * x * x), n);;
val cbsum : int -> int = <fun>
# let sq5 = ((fun x -> x * x), 5) in
#   sigma sq5;;
- : int = 55
# (fun x -> x * x) 7;;
- : int = 49
2,3ÈÖÌܤÎÎã¤Î¤è¤¦¤Ë¡¤Æ¿Ì¾´Ø¿ô¤ÏÁȤÎÍ×ÁǤˤâ¤Ê¤ê¡¤¤Þ¤¿(¤¢¤Þ¤ê¼ÂÍÑŪ¤Ê °ÕÌ£¤Ï¤Ê¤¤¤¬)ľÀÜŬÍѤ¹¤ë¤³¤È¤â¤Ç¤­¤ë¡¥ ¤Þ¤¿¡¤¤¤¤º¤ì¤ÎÎã¤Ç¤â fun ¤Î¤Þ¤ï¤ê¤Î () ¤¬É¬ÍפǤ¢¤ë(¤³¤ì¤¬¤Ê¤¤¤È¡¤ “, n” ¤¬´Ø¿ôËÜÂΤΰìÉô¤È»×¤ï¤ì¤Æ¤·¤Þ¤¤¡¤x * x * x ¤È n ¤Î ÁȤòÊÖ¤¹´Ø¿ô¤È¤·¤Æ²ò¼á¤µ¤ì¤Æ¤·¤Þ¤¦¡¥°ìÈÌŪ¤Ë¤Ï¡¤fun ¤Ï¤Ç¤­¤ë¸Â¤êÀè¤Þ¤Ç ´Ø¿ôËÜÂΤȻפ¤¹þ¤â¤¦¤È¤¹¤ë¤Î¤Ç¡¤Å¬µ¹()¤ò»È¤Ã¤Æ¤É¤³¤Þ¤Ç´Ø¿ôËÜÂΤ« ¼¨¤·¤Æ¤ä¤ëɬÍפ¬¤¢¤ë¡¥)

¼Â¤Ï¡¤let ¤Ë¤è¤ë´Ø¿ôÀë¸À
let f x = e
¤Ï
let f = fun x -> e
¤Îάµ­Ë¡¤Ç¤¢¤ë¡¥¤³¤Î¤³¤È¤«¤é¡¤´Ø¿ô¤ò¹½À®¤¹¤ë¤³¤È (fun)¤È¡¤ ¤½¤ì¤Ë̾Á°¤ò¤Ä¤±¤ë¤³¤È (let) ¤Ï¡¤É¬¤º¤·¤â´ØÏ¢¤·¤Æ¤¤¤Ê¤¤Ê̤λÅÁÈ¤ß¤Ç ¤¢¤ë¤³¤È¤¬¤ï¤«¤ë¡¥

4.1.3  ¥«¥ê¡¼²½¤È´Ø¿ô¤òÊÖ¤¹´Ø¿ô

Objective Caml ¤Î´Ø¿ô¤ÏÁ´¤Æ°ì°ú¿ô¤Ç¤¢¤ë¤¿¤á¡¤°ú¿ô¤¬Æó¤Ä°Ê¾åɬÍפʴؿô¤òÄêµÁ¤¹ ¤ë¤Ë¤ÏÁȤòÍѤ¤¤ë¤³¤È¤ò¤ß¤Æ¤­¤¿¡¥¤³¤³¤Ç¤Ï¡¤¡Ö´Ø¿ô¤òÊÖ¤¹´Ø¿ô¡×¤ò»È¤Ã¤Æ°ú ¿ô¤¬Ê£¿ô¤¢¤ë´Ø¿ô¤òÌÏÊï¤Ç¤­¤ëÊýË¡¤ò¤ß¤ë¡¥¤³¤Î¤è¤¦¤Ê¡Ö´Ø¿ô¤òÊÖ¤¹´Ø¿ô¡×¤ò ͭ̾¤ÊÏÀÍý³Ø¼ÔHaskell Curry ¤Î̾¤ò¤È¤Ã¤Æ¥«¥ê¡¼²½´Ø¿ô(curried function)¤È¸Æ¤Ö2¡¥

´ðËÜŪ¤Ê¥¢¥¤¥Ç¥¢¤Ï¡Öx ¤È y ¤ò¼õ¤±¼è¤ê e ¤ò·×»»¤¹¤ë´Ø¿ô¡×¤ò¡Ö x ¤ò¼õ¤±¼è¤ë¤È¡¤¡Øy ¤ò¼õ¤±¼è¤Ã¤Æ e ¤ò·×»»¤¹¤ë´Ø¿ô¡Ù¤òÊÖ¤¹ ´Ø¿ô¡×¤È¤·¤Æɽ¸½¤¹¤ë¤³¤È¤Ç¤¢¤ë¡¥¶ñÂÎŪ¤ÊÎã¤È¤·¤Æ¡¤Æó¤Ä¤Îʸ»úÎó s1, s2 ¤«¤é s1s2 ¤Î¤è¤¦¤ÊÏ¢·ë¤ò¤·¤¿Ê¸»úÎó¤òÊÖ¤¹´Ø¿ô¤ò¹Í¤¨¤Æ¤ß¤è¤¦¡¥ ¤³¤ì¤Þ¤Ç¤Ë¤ß¤Æ¤­¤¿¡¤ÁȤò»È¤Ã¤¿ÄêµÁ¤Ç¤Ï¡¤
# let concat (s1, s2) = s1 ^ s2 ;;
val concat : string * string -> string = <fun>
¤ÈÄêµÁ¤µ¤ì¡¤·¿¤Ï¤Þ¤µ¤Ë¡Öʸ»úÎó¤òÆó¤Ä(ÁȤˤ·¤Æ)¼õ¤±¼è¤êʸ»úÎó¤òÊÖ¤¹¡× ¤³¤È¤òɽ¤·¤Æ¤¤¤ë¡¥»È¤¦¾ì¹ç¤âÆó¤Ä¤Îʸ»úÎó¤òƱ»þ¤Ë»ØÄꤷ¤Æ concat ("abc", "def") ¤Î¤è¤¦¤Ë¸Æ¤Ó½Ð¤¹¡¥

¤µ¤Æ¡¤¤³¤Î´Ø¿ô¤ò ¥«¥ê¡¼²½´Ø¿ô¤È¤·¤ÆÄêµÁ¤·¤Æ¤ß¤è¤¦¡¥
# let concat_curry s1 = fun s2 -> s1 ^ s2;;
val concat_curry : string -> string -> string = <fun>
concat_curry ¤Ï fun ¼°¤òÍѤ¤¤Æ¡¤¡Ös2 ¤ò¼õ¤±¼è¤Ã¤Æ(´û¤Ë¼õ¤±¼è¤êºÑ¤Î) s1 ¤ÈÏ¢·ë¤¹¤ë¤è¤¦¤Ê´Ø¿ô¡×¤òÊÖ¤·¤Æ¤¤¤ë¡¥concat_curry ¤Î·¿¤Ï string -> (string -> string) ¤ÈƱ¤¸¤Ç¡¤¤½¤Î¤³¤È¤ò¼¨¤·¤Æ¤¤¤ë¡¥ ¤³¤Î´Ø¿ô¤ò¸Æ¤Ó½Ð¤¹¤Ë¤Ï¡¤2²ó¤Î´Ø¿ôŬÍѤò·Ð¤Æ¡¤
# (concat_curry "abc") "def";;
- : string = "abcdef"
¤Î¤è¤¦¤Ë¹Ô¤¦¡¥(...) Æâ¤Î´Ø¿ôŬÍѤǡ¤¡Ö"abc" ¤ÈÍ¿¤¨¤é¤ì¤¿°ú¿ô¤ò Ï¢·ë¤¹¤ë¤è¤¦¤Ê´Ø¿ô¡×¤¬Ê֤äƤ­¤Æ¤ª¤ê¡¤³°Â¦¤Î´Ø¿ôŬÍÑ (...) "def" ¤Çʸ»úÎó¤ÎÏ¢·ë¤¬¹Ô¤ï¤ì¤ë¡¥

¥«¥ê¡¼²½´Ø¿ô¤Ï¡¤ÁȤòÍѤ¤¤¿ÄêµÁ¤È°ã¤Ã¤Æ¡¤ºÇ½é¤Î¤¤¤¯¤Ä¤«¤Î¤Î°ú¿ô¤ò ¸ÇÄꤷ¤¿¤è¤¦¤Ê´Ø¿ô¤òºî¤ê¤¿¤¤»þ¤Ë´Ê·é¤Ë¼Â¸½¤Ç¤­¤ë¡¥Î㤨¤Ð¡¤·É¾Î Mr. ¤ò ̾Á°(ʸ»úÎó)¤ËÉղ乤ë´Ø¿ô¤ò
# let add_title = concat_curry "Mr. ";;
val add_title : string -> string = <fun>
# add_title "Igarashi";;
- : string = "Mr. Igarashi"
¤ÈÄêµÁ¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥add_title ¤Ï°ú¿ô¤ÎÃÖ¤­´¹¤¨¥â¥Ç¥ë¤Ë¤·¤¿ ¤¬¤Ã¤Æ¡¤fun s2 -> "Mr. " ^ s2 ¤È¤¤¤¦´Ø¿ô¤Ë«Çû¤µ¤ì¤Æ¤¤¤ë ¤È¹Í¤¨¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥ ¤³¤Î¤è¤¦¤Ë¡¤¥«¥ê¡¼²½¤µ¤ì¤¿´Ø¿ô¤Î°ìÉô¤Î°ú¿ô¤òÍ¿¤¨¤Æ¡¤Æò½¤·¤¿ ´Ø¿ô¤òºî¤ë¤³¤È¤òÉôʬŬÍÑ(partial application)¤È¸Æ¤Ö¡¥

¥«¥ê¡¼²½´Ø¿ô¤Î·¿¤Ï¡¤ÆɤßÊý¤Ë¤è¤Ã¤Æ¡¤¡ÖÆó°ú¿ô¤Î´Ø¿ô¤Î·¿¡×¤ÈÆɤळ¤È¤â¡¤ ¡Ö´Ø¿ô¤òÊÖ¤¹´Ø¿ô¡×¤ÈÆɤळ¤È¤â¤Ç¤­¤ë¡¥

´Ø¿ôÄêµÁ¤Îʸˡ³ÈÄ¥
¾å¤Î¥«¥ê¡¼²½´Ø¿ô¤ÎÄêµÁÊýË¡¤ò¡¤fun ¤òÆþ¤ì»Ò¤Ë¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¤ »°°ú¿ô¡¤»Í°ú¿ô¤Î´Ø¿ô¤Îɽ¸½¤Ë³ÈÄ¥¤·¤Æ¤¤¤¯¤³¤È¤â²Äǽ¤Ç¤¢¤ë¡¥

¼Â¤Ï¡¤Objective Caml ¤Ç¤Ï¡¤fun ¤òÆþ¤ì»Ò¤Ë¤¹¤ëÂå¤ê¤Ë¡¤let ¤ä fun ¤Ç¤Î¥Ñ¥é ¥á¡¼¥¿¥Ñ¥¿¡¼¥ó¤òÊ£¿ô¸Äʤ٤뤳¤È¤Ë¤è¤Ã¤Æ¡¤¥«¥ê¡¼²½´Ø¿ô¤ò¤è¤ê´Ê·é¤ËÄêµÁ ¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥Àè¤ÎÎã¤Ï¡¤
# let concat_curry s1 s2 = s1 ^ s2;;
val concat_curry : string -> string -> string = <fun>
¤ÈÄêµÁ¤¹¤ë¤³¤È¤â¡¤
# let concat_curry = fun s1 s2 -> s1 ^ s2;;
val concat_curry : string -> string -> string = <fun>
¤ÈÄêµÁ¤¹¤ë¤³¤È¤â²Äǽ¤Ç¤¢¤ë¡¥°ìÈÌŪ¤Ë¤Ï¡¤
fun ⟨ ¥Ñ¥¿¡¼¥ó1 ⟩ -> fun ⟨ ¥Ñ¥¿¡¼¥ó2 ⟩ -> ... fun ⟨ ¥Ñ¥¿¡¼¥ón ⟩ -> e
¤Ï
fun ⟨ ¥Ñ¥¿¡¼¥ó1 ⟩ ⟨ ¥Ñ¥¿¡¼¥ó2 ⟩ ... ⟨ ¥Ñ¥¿¡¼¥ón ⟩ -> e
¤ÈƱ¤¸¤Ç¤¢¤ë¡¥(let ¤Ë¤Ä¤¤¤Æ¤âƱÍͤ˥ѥ¿¡¼¥ó¤ò¶õÇò¤Ç¶èÀڤäÆʤ٤뤳¤È¤¬¤Ç ¤­¤ë¡¥)

¤Þ¤¿¡¤´Ø¿ôŬÍѤâ (((f x) y) z) ¤È½ñ¤¯Âå¤ê¤Ë f x y z ¤È¡¤³ç¸Ì¤ò¾Êά¤¹¤ë ¤³¤È¤¬¤Ç¤­¤ë¡¥(Ê̤θÀ¤¤Êý¤ò¤¹¤ë¤È¡¤´Ø¿ôŬÍѼ°¤Ïº¸·ë¹ç¤¹¤ë¡¥) ´Ø¿ô·¿¹½ÃۻҤϡ¤´û¤Ë¸«¤¿¤è¤¦¤Ë¡¤±¦·ë¹ç¤·¡¤ t1 -> t2 -> t3 -> t4 ¤Ï t1 -> (t2 -> (t3 -> t4)) ¤ò°ÕÌ£¤¹¤ë¡¥

ÃæÃÖ/Á°Ãֱ黻»Ò
¤³¤ì¤Þ¤Ç¡¤¤Ê¤ó¤ÎÀâÌÀ¤â¤Ê¤·¤Ë»È¤Ã¤Æ¤­¤¿¤¬¡¤+, ^ ¤Ê¤É¤ÎÃæÃֱ黻 »Ò(infix operator) ¤Ï¡¤ÆâÉô¤Ç¤Ï¥«¥ê¡¼²½¤µ¤ì¤¿´Ø¿ô (int->int->int ¤Ê¤É ¤Î·¿¤ò¤â¤Ä) ¤È¤·¤ÆÄêµÁ¤µ¤ì¤Æ¤¤¤ë¡¥¤µ¤é¤Ë¡¤¥×¥í¥°¥é¥Þ¤¬¿·¤¿¤ÊÃæÃֱ黻»Ò¤ò ÄêµÁ¤·¤¿¤ê¡¤(´«¤á¤é¤ì¤Ê¤¤¤¬) + ¤Ê¤É¤òºÆÀë¸À¤¹¤ë¤³¤È¤¹¤é¤â²Äǽ¤Ç¤¢¤ë¡¥

ÃæÃֱ黻»Ò¤Ï ( ¤È ) ¤Ç°Ï¤à¤³¤È¤Ë¤è¤Ã¤Æ¡¤Ä̾ï¤Î´Ø¿ô¤È¤·¤Æ(Á°ÃÖµ­Ë¡)¤Ç »È¤¦¤³¤È¤¬¤Ç¤­¤ë¡¥
# (+);;
- : int -> int -> int = <fun>
# ( * ) 2 3;;
- : int = 6
* ¤ÎÁ°¸å¤Ë¶õÇò¤¬Æþ¤Ã¤Æ¤¤¤ë¤Î¤Ï¡¤¥³¥á¥ó¥È¤Î³«»Ï/½ªÎ»¤È¶èÊ̤¹¤ë¤¿¤á¤Ç¤¢¤ë¡¥

ÃæÃֱ黻»Ò¤È¤·¤Æ»ÈÍѲÄǽ¤Êµ­¹æ¤Ï¡¤mod, lor, or ¤Ê¤É¤ÎÁ°¾Ï¤Þ¤Ç¤Ë ÃæÃֱ黻»Ò¤È¤·¤Æ¾Ò²ð¤·¤¿¥­¡¼¥ï¡¼¥É¡¤¤â¤·¤¯¤Ï ¤òËþ¤¿¤¹Ê¸»úÎó¤Ç¤¢¤ë¡¥

ÄêµÁ¤ò¤¹¤ë¤Ë¤Ï (⟨ ÃæÃֱ黻»Ò ⟩) ¤òÉáÄ̤Î̾Á°¤À¤È»×¤Ã¤Æ¹Ô¤¦¡¥
# let (^-^) x y = x * 2 + y * 3;;
val ( ^-^ ) : int -> int -> int = <fun>
# 9 ^-^ 6;;
- : int = 36
¤Þ¤¿¡¤Á°Ãֱ黻»Ò¤È¤¤¤Ã¤Æ¡¤ÄêµÁ¤¹¤ë¤È¤­¤äñÆȤǴؿôÃͤȤ·¤Æ»È¤¦¤È¤­¤Ï () ¤¬É¬Íפʡ¤µ­¹æÎ󤫤é¤Ê¤ë̾Á°¤¬ÍÑ°Õ¤µ¤ì¤Æ¤¤¤ë¡¥
# let ( !! ) x = x + 1;;
val ( !! ) : int -> int = <fun>
# !!;;
Characters 2-4:
 !!;;Syntax error
# (!!);;
- : int -> int = <fun>
# !! 3;;
- : int = 4
Á°Ãֱ黻»Ò¤Ï -, -. ¤â¤·¤¯¤Ï ¤«¤é¤Ê¤ëʸ»úÎó¤Ç¤¢¤ë¡¥°ì¸«¡¤Á°Ãֱ黻»Ò¤Ï´Ø¿ô¤Î̾Á°¤È¤·¤Æµ­¹æ¤¬»È¤¦¤¿¤á ¤Î¤â¤Î¤À¤±¤Î¤è¤¦¤Ë¸«¤¨¤ë¤¬¡¤¼ÂºÝ¤Ï¹½Ê¸²òÀϤǰ㤤¤¬¸½¤ì¤ë¡¥ Á°Ãֱ黻»Ò¤ÏÄ̾ï¤Î´Ø¿ôŬÍѤè¤ê¤â ·ë¹ç¤ÎÍ¥ÀèÅÙ¤¬¹â¤¯¡¤f !! x ¤Ï¡¤f (!! x) ¤È²ò¼á¤µ¤ì¤ë¡¥ (f g x ¤¬ (f g) x ¤È²ò¼á¤µ¤ì¤ë¤³¤È¤ÈÈæ³Ó¤»¤è¡¥)

ÃæÃֱ黻»ÒƱ»Î¤ÎÍ¥ÀèÅ٤ϡ¤Ì¾Á°¤«¤é·è¤Þ¤ë¡¥É½4.1¤Ï Í¥ÀèÅ٤ι⤤¤â¤Î¤«¤éʤ٤¿¤â¤Î¤Ç¤¢¤ë¡¥¥³¥ó¥¹¥È¥é¥¯¥¿¤Ê¤É¡¤Ì¤½Ð¤Î³µÇ°¡¤µ­¹æ ¤¬¤Ç¤Æ¤­¤Æ¤¤¤ë¤¬¤È¤ê¤¢¤¨¤ºÌµ»ë¤·¤Æ¤ª¤¤¤Æ¤è¤¤¡¥



Table 4.1: ±é»»»Ò¤ÎÍ¥Àè½ç°Ì¤È·ë¹ç


±é»»»Ò ·ë¹ç
Á°Ãֱ黻»Ò
´Ø¿ôŬÍÑ º¸
¥³¥ó¥¹¥È¥é¥¯¥¿Å¬ÍÑ
Á°Ãֱ黻»Ò¤È¤·¤Æ¤Î -, -.
** ¤Ç»Ï¤Þ¤ë̾Á° ±¦
*, /, %, ¤Ç»Ï¤Þ¤ë̾Á°¤ª¤è¤Ó mod º¸
+, - ¤Ç»Ï¤Þ¤ë̾Á° º¸
:: ±¦
@, ^ ¤Ç»Ï¤Þ¤ë̾Á° ±¦
=¡¤< ¤Ê¤ÉÈæ³Ó±é»»»Ò, ¤½¤Î¾¤ÎÃæÃֱ黻»Ò º¸
not
&, && º¸
or, || º¸
,
<-, := ±¦
if
; ±¦
let, match, fun, function, try

4.1.4  Case Study: Newton-RaphsonË¡

¹â³¬´Ø¿ô¤ÎÍ­¸ú¤ÊÎã¤È¤·¤Æ¡¤ÊýÄø¼°¤Î¶á»÷²ò¤òµá¤á¤ë Newton-Raphson Ë¡ ¤ò¥×¥í¥°¥é¥à¤·¤Æ¤ß¤è¤¦¡¥Newton-Raphson Ë¡¤Ï¡¤Èùʬ²Äǽ¤Ê´Ø¿ô f ¤Ë ÂФ·¤Æ¡¤ÊýÄø¼° f(x) = 0 ¤Î²ò¤òµá¤á¤ëÊýË¡¤Ç¤¢¤ê¡¤
g(x) = x
f(x)
f'(x)
¤ÎÉÔÆ°ÅÀ (g(a) = a ¤Ê¤ë a) ¤òµá¤á¤ë¡¥(¤â¤·¤¯¤Ï Á²²½¼° xn = xn−1f(xn−1) / f'(xn−1) ¤Î ¶Ë¸Â¤òµá¤á¤ë¡¥)

¤³¤ì¤ò²ò¤¯¥×¥í¥°¥é¥à¤ò¹Í¤¨¤Æ¤ß¤è¤¦¡¥¤Þ¤º¡¤Èùʬ¤ò¤É¤¦É½¸½¤¹¤ë¤«¤Ç¤¢¤ë¤¬¡¤ ¶á»÷Ū¤Ë¡¤¤È¤Æ¤â¾®¤µ¤¤Äê¿ô dx ¤ËÂФ·¤Æ
g'(x) =
g(x + dx) − g(x)
dx
¤È¤·¤è¤¦¡¥Èùʬ¤òµá¤á¤ë´Ø¿ô¤Ï¡¤¼«Á³¤Ë¼¡¤Î¤è¤¦¤Ê¹â³¬´Ø¿ô¤È¤·¤ÆÄêµÁ¤Ç¤­¤ë¡¥
# let deriv f = 
#   let dx = 0.1e-10 in 
#     fun x -> (f(x +. dx) -. f(x)) /. dx;;
val deriv : (float -> float) -> float -> float = <fun>
Î㤨¤Ð f(x) = x3 ¤Î 3 ¤Ë¤ª¤±¤ëÈùʬ·¸¿ô¤Ï¡¤
# deriv (fun x -> x *. x *. x) 3.0;;
- : float = 26.999913416148047
¤È·×»»¤µ¤ì¤ë¡¥

¼¡¤ËÉÔÆ°ÅÀ¤òµá¤á¤ë´Ø¿ô¤òÄêµÁ¤·¤Æ¤ß¤è¤¦¡¥¤³¤Î´Ø¿ô¤Ï¡¤´Ø¿ô f ¤È ½é´üÃÍ x ¤«¤é¡¤f(x), f(f(x)), ...¤ò·×»»¤·¤Æ¤¤¤­¡¤ fn(x) = fn−1(x) ¤È¤Ê¤Ã¤¿¤È¤­¤Î fn(x) ¤òÊÖ¤¹¡¥ ¼Â¿ô¤Î·×»»¤Ë¤Ï¸íº¹¤¬È¼¤¦¤Î¤Ç¼ÂºÝ¤Ë¤Ï¡¤¤¢¤ë»þÅÀ¤Ç |fn−1(x) − fn(x)| ¤¬¤¢¤ëïçÃͰʲ¼¤Ë¤Ê¤Ã¤¿¤È¤­¤Ë½ªÎ»¤È¤¹¤ë¡¥
# let fixpoint f init = 
#   (* computes a fixed-point of f, i.e., r such that f(r)=r *)
#   let threshold = 0.1e-10 in
#   let rec loop x = 
#     let next = f x in
#     if abs_float (x -. next) < threshold then x
#     else loop next 
#   in loop init;;
val fixpoint : (float -> float) -> float -> float = <fun>
¤µ¤Æ¡¤¤³¤ì¤ò»È¤Ã¤Æ¡¤Newton-Raphson Ë¡¤ÇÍѤ¤¤ëÉÔÆ°ÅÀ¤òµá¤á¤ë ¤Ù¤­´Ø¿ô¤Ï¸µ¤Î´Ø¿ô¤«¤é
# let newton_transform f = fun x -> x -. f(x) /. (deriv f x);;
val newton_transform : (float -> float) -> float -> float = <fun>
¤Ç·×»»¤Ç¤­¤ë¡¥

ºÇ½ªÅª¤Ë¡¤Newton-Raphson Ë¡¤Ç f(x) = 0 ¤Î²ò¤òµá¤á¤ë ´Ø¿ô¤Ï¡¤´Ø¿ô f ¤È½é´üÃͤȤ·¤ÆÍѤ¤¤ë guess ¤ò¼õ¤±¼è¤Ã¤Æ
# let newton_method f guess = fixpoint (newton_transform f) guess;;
val newton_method : (float -> float) -> float -> float = <fun>
¤ÈÄêµÁ¤Ç¤­¤ë¡¥
# let square_root x = newton_method (fun y -> y *. y -. x) 1.0;;
val square_root : float -> float = <fun>
# square_root 5.0;;
- : float = 2.23606797750364272

4.1.5  Îý½¬ÌäÂê



Exercise 1  ¼Â¿ô¾å¤Î´Ø¿ô f ¤ËÂФ·¤Æ ∫abf(x)dx ¤ò·×»»¤¹ ¤ë´Ø¿ô integral f a b ¤òÄêµÁ¤»¤è¡¥¤Þ¤¿¤³¤ì¤ò»È¤Ã¤Æ¡¤ ∫0πsinx dx ¤ò·×»»¤»¤è¡¥

¶á»÷Ū¤Ê·×»»ÊýË¡¤È¤·¤Æ¡¤¤³¤³¤Ç¤ÏÂæ·Á¶á»÷¤òÀâÌÀ¤¹¤ë¤¬Â¾¤ÎÊýË¡¤Ç¤âÎɤ¤¡¥ Âæ·Á¸ø¼°¤Ç¤Ï ba ¤ò n ʬ³ä¤·¤¿¶è´Ö¤ÎŤµ¤ò δ ¤È¤·¤Æ¡¤Âæ·Á¤Î½¸¤Þ¤ê¤È¤·¤Æ ·×»»¤¹¤ë¡¥iÈÖÌܤζè´Ö¤ÎÂæ·Á¤ÎÌÌÀѤÏ

f
a+
i−1
δ
+ f
a+iδ

⋅ δ
2
¤È¤·¤Æµá¤á¤é¤ì¤ë¡¥


Exercise 2  Îý½¬ÌäÂê7¤Î pow ´Ø¿ô¤ò¥«¥ê¡¼²½¤·¤ÆÄêµÁ¤»¤è¡¥ ¼¡¤ËÂè°ì°ú¿ô¤¬»Ø¿ô¤Ë¤Ê¤ë¤è¤¦(pow n x)¤ËÄêµÁ¤·¡¤3¾è¤¹¤ë´Ø¿ô cube ¤òÉôʬŬÍÑ¤Ç ÄêµÁ¤»¤è¡¥»Ø¿ô¤¬ÂèÆó°ú¿ô¤Ç¤¢¤ë¤è¤¦¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤ë¾ì¹ç (pow x n)¡¤cube ¤ò pow ¤«¤éÄêµÁ¤¹¤ë¤Ë¤Ï ¤É¤¦¤¹¤ì¤Ð¤è¤¤¤«?


Exercise 3  °Ê²¼¤Î3¤Ä¤Î·¿ ¤Î°ã¤¤¤òÀâÌÀ¤»¤è¡¥¤Þ¤¿¡¤³Æ·¿¤Ë°¤¹¤ëŬÅö¤Ê´Ø¿ô¤òÄêµÁ¤»¤è¡¥


4.2  Â¿ÁêÀ­

¤¤¤í¤¤¤í¤Ê´Ø¿ô¤ò½ñ¤¤¤Æ¤¤¤¯¤È¡¤°ú¿ô¤Î·¿¤Ë´Ø¤ï¤é¤ºÆ±¤¸¤³¤È¤ò¤¹¤ë´Ø¿ô¤¬½Ð ¸½¤¹¤ë¾ì¹ç¤¬¤·¤Ð¤·¤Ð¸½¤ì¤ë¡¥Î㤨¤Ð¡¤Æó¤ÄÁȤ«¤éÂè°ìÍ×ÁǤò¼è½Ð¤¹´Ø¿ô¤ò ¹Í¤¨¤Æ¤ß¤è¤¦¡¥Î㤨¤Ð¡¤int * int ¤ËÂФ¹¤ë¤³¤Î¤è¤¦¤Ê´Ø¿ô¤Ï¡¤
# let fstint ((x, y) : int * int) = x;;
val fstint : int * int -> int = <fun>
¤È½ñ¤±¤ë¡¥ÌÀ¼¨Åª¤Ë·¿¤òÀë¸À¤·¤Æ¤¤¤ë¤Î¤Ï¡¤°Õ¿ÞŪ¤Ç¤¢¤ë¡¥ ¤Þ¤¿¡¤(int * float) * string ¤Î¤è¤¦¤ÊÁȤÈʸ»úÎó¤ÎÁȤËÂФ·¤Æ ƱÍͤʴؿô¤òÄêµÁ¤¹¤ë¤È
# let fst_ifs ((x, y) : (int * float) * string) = x;;
val fst_ifs : (int * float) * string -> int * float = <fun>
¤È½ñ¤±¤ë¡¥¤µ¤Æ¡¤¤³¤³¤Þ¤Ç¤¯¤ë¤ÈÀ¸¤¸¤ëµ¿Ìä¤Ï¡¤ÁȤÎÍ×ÁǤÎÁȤ߹ç¤ï¤»¤´¤È¤Ë ¤¤¤Á¤¤¤ÁÊ̤ÎÂè°ìÍ×ÁǤò¼è¤ê½Ð¤¹´Ø¿ô¤ò¤«¤«¤Ê¤±¤ì¤Ð¤¤¤±¤Ê¤¤¤Î¤À¤í¤¦¤«?¤È ¤¤¤¦¤³¤È¤Ç¤¢¤ë¡¥¤³¤ì¤é¤Î´Ø¿ô¤Ï°ú¿ô¤Î·¿¤ò½ü¤¤¤ÆƱ¤¸³Ê¹¥¤ò¤·¤Æ¤¤¤ë¡¥¤½¤ì ¤Ê¤é¤Ð¡¤¶¦ÄÌÉôʬ¤Ï¤Ò¤È¤Ä¤ÎÄêµÁ¤Ë¤ª¤µ¤á¡¤º¹°Û¤ò¥Ñ¥é¥á¡¼¥¿²½¤Ç¤­¤Ê¤¤¤À¤í ¤¦¤«? ¥Ñ¥é¥á¡¼¥¿²½¤¹¤ë¤È¤·¤¿¤é¡¤¥Ñ¥é¥á¡¼¥¿¤Ï°ìÂΤʤó¤Ç¤¢¤í¤¦¤«?

Ãí°Õ¿¼¤¯¹Í¤¨¤ë¤È¡¤¤³¤Î¶¦Ä̤ÎÄêµÁ¤Ï°ú¿ô¤Î¡Ö·¿¡×¡¤¤è¤êÀµ³Î¤Ë¤ÏÂè°ìÍ×ÁÇ ¤ÈÂèÆóÍ×ÁǤη¿(int¤Èint¡¤¤Þ¤¿¤Ï int * float ¤È string)¤Ë´Ø¤·¤Æ ¥Ñ¥é¥á¡¼¥¿²½¤¹¤ë¤³¤È¤Ë¤Ê¤ë¤³¤È¤¬¤ï¤«¤ë¤À¤í¤¦¡¥¤Þ¤¿¡¤¤³¤Î¥Ñ¥é¥á¡¼¥¿¤È¤· ¤Æ¤Ïº£¤Þ¤Ç¤Î´Ø¿ô¤È¤Ï°Û¤Ê¤ê¡¤¡Ö·¿¤òɽ¸½¤¹¤ëÊÑ¿ô¡×¤Î¤è¤¦¤Ê¤â¤Î¤¬É¬Íפʤ³¤È¤¬ ¤ï¤«¤ë¡¥¤³¤ì¤òÌÀ¼¨Åª¤Ë½ñ¤­É½¤·¤¿¤Î¤¬²¼¤Î´Ø¿ôÀë¸À¤Ç¤¢¤ë¡¥
# let fst ((x, y) : 'a * 'b) = x;;
val fst : 'a * 'b -> 'a = <fun>
'a ¤È 'b ¤¬·¿ÊÑ¿ô(type variable)¤È¸Æ¤Ð¤ì¤ë¤â¤Î¤Ç¤¢¤ë¡¥ ¤³¤Î¤è¤¦¤Ê¡Ö·¿¤Ë´Ø¤·¤ÆÃê¾Ý²½¤µ¤ì¤¿´Ø¿ô¡×¤ò¿ÁêŪ´Ø¿ô(polymorphic function)¤È¸Æ¤Ö¡¥¤³¤Î fst ¤Î·¿ 'a * 'b -> 'a ¤Ï ¡ÖǤ°Õ¤Î·¿ T1, T2 ¤ËÂФ·¤Æ¡¤T1 * T2 -> T1¡×¤ÈÆɤळ¤È¤¬¤Ç¤­¤ë¡¥ (ÏÀÍýµ­¹æ¤ò»È¤¦¤Ê¤é¤Ð ∀'a.∀ 'b.('a * 'b -> 'a) ¤È¹Í¤¨¤ë ¤Î¤¬¤è¤êÀµ³Î¤Ç¤¢¤ë¡¥) ¼Â¤Ï¡¤Objective Caml ¤Î·¿¿äÏÀµ¡Ç½¤Ï¤³¤Î¤è¤¦¤Ê¿ÁêŪ´Ø¿ô¤ÎÀë¸À¤ËºÝ¤·¤Æ¤â¡¤ ÌÀ¼¨Åª¤Ë·¿ÊÑ¿ô¤òƳÆþ¤¹¤ëɬÍפϤʤ¤¡¥
# let fst (x, y) = x;;
val fst : 'a * 'b -> 'a = <fun>
Ä̾ï¤Î¡Ö¼°¤Ë´Ø¤·¤ÆÃê¾Ý²½¤µ¤ì¤¿´Ø¿ô¡×¤òŬÍѤ¹¤ëºÝ¤Ë¡¤¼Â°ú¿ô¡¤¤Ä¤Þ¤ê¥Ñ¥é ¥á¡¼¥¿¤Î¼ÂºÝ¤ÎÃͤòÅϤ¹¤Î¤ÈƱÍÍ¡¤Â¿ÁêŪ´Ø¿ô¤Ë¤Ï¡Ö·¿¤Î¼Â°ú¿ô¡×¤òÅϤ¹¤È¹Í ¤¨¤é¤ì¤ë¤¬¡¤¼ÂºÝ¤Î¥×¥í¥°¥é¥à¤Ç¤Ï¡¤·¿°ú¿ô¤òÌÀ¼¨Åª¤Ë½ñ¤­²¼¤¹É¬ÍפϤʤ¤¡¥ (½ñ¤­²¼¤¹¤¿¤á¤Îʸˡ¤ÏÍÑ°Õ¤µ¤ì¤Æ¤¤¤Ê¤¤¡¥)
# fst (2, 3);;
- : int = 2
# fst ((4, 5.2), "foo");;
- : int * float = (4, 5.2)
³µÇ°Åª¤Ë¤Ï¡¤ºÇ½é¤ÎÎã¤Ç¤Ï 'a, 'b ¤Ë int ¤¬¡¤¼¡¤ÎÎã¤Ç¤Ï 'a ¤Ë int * float¡¤'b ¤Ë string ¤¬ÅϤäƤ¤¤ë¤È¹Í¤¨¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥ Ê̤θ«Êý¤ò¤¹¤ë¤È¡¤fst ¤È¤¤¤¦¼°¤¬¡¤Æó¤Ä¤Î°ã¤Ã¤¿·¿¤Î¼°int * int -> int ¤È (int * float) * string -> int * float ¤È¤·¤Æ»È ¤ï¤ì¤Æ¤¤¤ë¤È¸«¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥¤³¤Î¤è¤¦¤Ë°ì¤Ä¤Î¼°¤¬Ê£¿ô¤Î·¿¤ò»ý¤Ä¤³¤È¤ò ¸À¸ì¤Ë¿ÁêÀ­(polymorphism)¤¬¤¢¤ë¡¤¤È¤¤¤¦¡¥¤Þ¤¿¡¤Æäˡ¤´Ø¿ô¤Î ·¿¾ðÊó¤Î°ìÉô¤ò¥Ñ¥é¥á¡¼¥¿²½¤¹¤ë¤³¤È¤Ë¤è¤Ã¤ÆȯÀ¸¤¹¤ë¿ÁêÀ­¤ò¥Ñ ¥é¥á¡¼¥¿Â¿Áê(parametric polymorphism)¤È¸Æ¤Ö¡¥¥Ñ¥é¥á¡¼¥¿Â¿Áê¤Î´Ø¿ô¤Ï ·¿ÊÑ¿ô¤Ë²¿¤¬ÅϤµ¤ì¤è¤¦¤È¤â¤½¤Î¿¶Éñ¤¤¤ÏƱ¤¸¤Ç¤¢¤ë¤È¤¤¤¦ÆÃħ¤¬¤¢¤ë¡¥ ¿ÁêÀ­¤Ï¡¤¤Ò¤È¤Ä¤ÎÄêµÁ¤Î(ºÆ)ÍøÍÑÀ­¤ò¹â¤á¤ë¤Î¤ËÈó¾ï¤ËÌòΩ¤Ä¡¥

¤¤¤¯¤Ä¤«Â¿ÁêÀ­¤Î¤¢¤ë´Ø¿ô¤ÎÎã¤ò¤ß¤Æ¤ß¤è¤¦¡¥°Ê²¼¤Î id ¤Ï¹±Åù´Ø¿ô( identity function)¤È¤è¤Ð¤ì¡¤ Í¿¤¨¤é¤ì¤¿°ú¿ô¤ò¤½¤Î¤Þ¤ÞÊÖ¤¹´Ø¿ô¤Ç¤¢¤ë¡¥¤Þ¤¿¡¤´Ø¿ôŬÍÑ´Ø¿ô apply ¤Ï´Ø¿ô¤È ¤½¤Î°ú¿ô¤ò°ú¿ô¤È¼õ¤±¼è¤Ã¤Æ¡¤´Ø¿ôŬÍѤò¹Ô¤¦¡¥
# let id x = x;;
val id : 'a -> 'a = <fun>
# let apply f x = f x;;
val apply : ('a -> 'b) -> 'a -> 'b = <fun>
apply ¤Î·¿¤Ç¤Ï¡¤('a -> 'b) ¤¬ f ¤Î·¿¤ò¡¤'a ¤¬ x ¤Î·¿¤ò¼¨¤¹¡¥·¿ÊÑ¿ô 'a ¤¬¡¤¤Õ¤¿¤Ä¤Î°ú¿ô f ¤È x ¤Î´Ö¤ÎÀ©Ì󡤤Ĥޤê f ¤Ï x ¤ËŬÍÑ¤Ç ¤­¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤³¤È¤òɽ¸½¤·¤Æ¤¤¤ë¤³¤È¤ËÃí°Õ¤·¤¿¤¤¡¥
# abs;;
- : int -> int = <fun>
# apply abs (-5);;
- : int = 5
# apply abs "baz";;
 apply abs "baz";;
 ^^^^^
This expression has type string but is here used with type int
´Ø¿ô¤Î¿ÁêÀ­¤Ï¤É¤³¤ËͳÍ褹¤ë¤â¤Î¤Ç¤¢¤í¤¦¤«? fst ¤ÎÄêµÁ¤ò¤è¤¯¸«¤ë¤È¡¤ ËܼÁŪ¤Ë¡¤(x, y) ¤È¤¤¤¦¥Ñ¥¿¡¼¥ó¤ÎÍ×ÀÁ¤¹¤ë°ú¿ô¤Ë´Ø¤¹¤ëÀ©Ìó¤Ï¡¤¡ÖÆó¤Ä ÁȤǤ¢¤ë¤³¤È¡×¤À¤±¤Ç¡¤³ÆÍ×ÁǤ¬À°¿ô¤Ç¤¢¤í¤¦¤¬¡¤Ê¸»úÎó¤Ç¤¢¤í¤¦¤¬¡¤¹½¤ï¤Ê ¤¤¤Ï¤º¤Ç¤¢¤ë¡¥¤Þ¤¿¡¤ ³ÆÍ×ÁÇ x, y ¤ËÂФ·¤Æ²¿¤ÎÁàºî¤â¹Ô¤ï¤ì¤Æ¤¤¤Ê¤¤ ¤¿¤á¡¤¤½¤ì¤¬Í£°ì¤ÎÀ©Ìó¤Ç¤¢¤ë¡¥¤Þ¤¿¡¤apply ¤ÎÄêµÁ¤«¤é¤Ïf ¤ËÂФ¹¤ëÍ× ÀÁ¤Ï¡Öx ¤ËŬÍѤǤ­¤ë´Ø¿ô¤Ç¤¢¤ë¤³¤È¡×¤À¤±¤Ç¤¢¤ë¡¥¤³¤Î¤è¤¦¤Ë¡¤¥Ñ¥é¥á¡¼ ¥¿Â¿Áê¤Ï¡¤´Ø¿ô¤¬°ú¿ô¤ÎÉôʬŪ¤Ê¹½Â¤(ÁȤǤ¢¤ë¡¤´Ø¿ô¤Ç¤¢¤ë¤³¤È)¤Î¤ß¤Ç·×»» ¤¬¹Ô¤ï¤ì¤ë¤³¤È¤Ëµ¯°ø¤·¤Æ¤¤¤ë¡¥¤Þ¤¿·¿ÊÑ¿ô¤Ï¡¤´Ø¿ô¼«¿È¤ÏÁàºî¤·¤Ê¤¤Éôʬ¤Î ¹½Â¤¤òÃê¾Ý²½¤·¤Æ¤¤¤ë¤È¹Í¤¨¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥¤Ä¤Þ¤ê 'a * 'b -> 'a ¤È¤¤¤¦ ·¿¤ò¸«¤ì¤Ð¡¤¤½¤Î´Ø¿ô¤¬°ú¿ô¤ÎÂè°ìÍ×ÁǤâÂèÆóÍ×ÁǤâ»È¤ï¤Ê¤¤¤³¤È¤¬ ¤ï¤«¤ë¤Î¤Ç¤¢¤ë¡¥
ÍÍ¡¹¤Ê¿ÁêÀ­ ¤½¤Î¾¤Î¿ÁêÀ­¤È¤·¤Æ¤Ï¡¤Â¿¤¯¤Î¸À¸ì¤Ë¸«¤é¤ì¤ë + ¤È¤¤¤¦°ì¤Ä¤Îµ­¹æ¤¬À°¿ôƱ»Î¤â¤·¤¯¤Ï¼Â¿ôƱ»Î¤Î ­¤·»»¤É¤Á¤é¤Ç¤â»È¤¨¤ë¡¤¤È¤¤¤Ã¤¿¥¢¥É¥Û¥Ã¥¯¤Ê¿ÁêÀ­(ad-hoc polymorphism) ¤È¸Æ¤Ð¤ì¤ë¤â¤Î¡¤¥ª¥Ö¥¸¥§¥¯¥È»Ø¸þ¸À¸ì¤Ç¸«¤é¤ì¤ë¿Æ»Ò¥¯¥é¥¹´Ø ·¸¤Ê¤É¡¤·¿¾å¤ËÄêµÁ¤µ¤ì¤¿Æó¹à´Ø·¸¤Ë¤è¤Ã¤Æ¡¤¼°¤¬Ê£¿ô¤Î·¿¤ò»ý¤Á¤¦¤ë Éôʬ·¿Â¿Áê(subtyping polymorphism) ¤È¤¤¤Ã¤¿¤â¤Î¤¬¤¢¤ë¡¥

4.2.1  let¿Áê¤ÈÃÍ¿Áê

Objective Caml ¤Ç¤Ï¿ÁêÀ­¤ò»ý¤Æ¤ë¤Î¤Ï¡¤let(Àë¸À¤â¤·¤¯¤Ï¼°)¤ÇƳÆþ¤µ¤ì¤¿ ÄêµÁ¤Î¤ß¤Ç¤¢¤ë¡¥´Ø¿ô¤Î¥Ñ¥é¥á¡¼¥¿¤ò¿ÁêŪ¤Ë»È¤¦¤³¤È¤Ï¤Ç¤­¤Ê¤¤¡¥ ¶ñÂÎŪ¤Ë¤Ï¡¤²¼¤ÎÎã¤Ç x ¤ò(id ¤¬Íè¤ë¤È¤ï¤«¤Ã¤Æ¤¤¤Æ¤â)°Û¤Ê¤ë·¿¤ÎÃͤؤΠŬÍѤϵö¤µ¤ì¤Ê¤¤¡¥
# (fun x -> (x 1, x 2.0)) id;;
 (fun x -> (x 1, x 2.0)) id;;
 ^^^
This expression has type float but is here used with type int
¤³¤Î¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤Ï¡¤x 1 ¤ò·¿¿äÏÀ¤·¤¿»þÅÀ¤Ç x ¤Î°ú¿ô¤Î·¿¤Ï int ¤È¤·¤Æ·èÄꤵ¤ì¤Æ¤·¤Þ¤Ã¤¿¤Î¤Ë¡¤float ¤ËÂФ·¤ÆŬÍѤ·¤Æ¤¤¤ë¡¤¤È¤¤¤¦ °ÕÌ£¤Ç¤¢¤ë¡¥

¤Þ¤¿¡¤Ç¤°Õ¤Î let Àë¸À/¼°¤Ç¤è¤¤¤ï¤±¤Ç¤Ï¤Ê¤¯¡¤ÄêµÁ¤µ¤ì¤ë¤â¤Î(±¦ÊÕ)¤¬ ¡ÖÃ͡פǤʤ±¤ì¤Ð¤¤¤±¤Ê¤¤¡¤¤È¤¤¤¦À©¸Â3¤¬¤¢¤ë¡¥ÃͤȤ·¤Æ°·¤ï¤ì¤ë¤â¤Î¤Ï¡¤´Ø¿ô¤ÎÀë¸À¡¤Äê¿ô¡¤¤Ê¤É·×»» ¤òɬÍפȤ·¤Ê¤¤¼°¤Ç¤¢¤ë¡¥µÕ¤Ëµö¤µ¤ì¤Ê¤¤¤â¤Î¤Ï¡¤´Ø¿ôŬÍѤʤɤΡ¤ÃͤËɾ²Á ¤µ¤ì¤ë¤Þ¤Ç¤Ë·×»»¤òȼ¤¦¼°¤Ç¤¢¤ë¡¥°Ê²¼¤ÎÎã¤Ïf ¤ò x ¤ËÆóÅÙŬÍѤ¹¤ë double ´Ø¿ô¤Ç¤¢¤ë¡¥
# let double f x = f (f x);;
val double : ('a -> 'a) -> 'a -> 'a = <fun>
# double (fun x -> x + 1) 3;;
- : int = 5
# double (fun s -> "<" ^ s ^ ">") "abc";;
- : string = "<<abc>>"
¤µ¤é¤Ë¡¤¤³¤Î´Ø¿ô¤òÁȤ߹ç¤ï¤»¤ë¤È¡¤Æ±¤¸´Ø¿ô¤ò4ÅÙŬÍѤ¹¤ë´Ø¿ô¤È¤·¤ÆÍѤ¤¤ë¤³¤È ¤¬¤Ç¤­¤ë¡¥
# double double (fun x -> x + 1) 3;;
- : int = 7
# double double (fun s -> "<" ^ s ^ ">") "abc";;
- : string = "<<<<abc>>>>"
¤È¤³¤í¤¬¤³¤Î double double ¤ò let ¤Ç¤½¤Î¤Þ¤ÞÀë¸À¤·¤Æ¤â¡¤±¦ÊÕ¤¬´Ø¿ô ŬÍѤǤ¢¤ê¡¤ÃͤǤϤʤ¤¤Î¤Ç¡¤Â¿ÁêŪ¤Ë¤Ä¤«¤¦¤³¤È¤Ï¤Ç¤­¤Ê¤¤¡¥
# let fourtimes = double double in
# (fourtimes (fun x -> x+1) 3,
#  fourtimes (fun s -> "<" ^ s ^ ">") "abc");;
 fourtimes (fun s -> "<" ^ s ^ ">") "abc");;
 ^
This expression has type int but is here used with type string
¤³¤ì¤ò let¼°¤Ç¤Ï¤Ê¤¯¤Æ let Àë¸À¤·¤¿¾ì¹ç¤âƱÍͤÊÀ©¸Â¤¬²Ý¤»¤é¤ì¤ë¡¥
# let fourtimes = double double;;
val fourtimes : ('_a -> '_a) -> '_a -> '_a = <fun>
¥¢¥ó¥À¡¼¥¹¥³¥¢¤Î¤Ä¤¤¤¿·¿ÊÑ¿ô '_a ¤Ï¡¤¡Ö°ìÅÙ¤À¤±¡×Ǥ°Õ¤Î·¿¤ËÃÖ´¹¤Ç¤­¤ë ·¿ÊÑ¿ô¤Ç¤¢¤ê¡¤°ìÅÙ·è¤Þ¤Ã¤Æ¤·¤Þ¤¦¤ÈÆóÅÙ¤ÈÊ̤η¿¤È¤·¤Æ»È¤¦¤³¤È¤Ï¤Ç¤­¤Ê¤¤¡¥ ¤³¤Î¤¿¤á¡¤Â¿ÁêŪ¤Ë fourtimes ¤ò»ÈÍѤ¹¤ë¤³¤È¤Ï¤Ç¤­¤Ê¤¤¡¥
# fourtimes (fun x -> x + 1) 3;;
- : int = 7
# fourtimes;;
- : (int -> int) -> int -> int = <fun>
# fourtimes (fun s -> "<" ^ s ^ ">") "abc";;
 fourtimes (fun s -> "<" ^ s ^ ">") "abc";;
 ^
This expression has type int but is here used with type string
fourtimes ¤Î·¿ÊÑ¿ô¤¬°ìÅÙÌܤÎŬÍÑ¤Ç int ¤Ë¸ÇÄꤵ¤ì¤Æ¤·¤Þ¤Ã¤Æ¤¤¤ë¡¥

¤³¤ÎÀ©¸Â¤òÃÍ¿Áê(value polymorphism)¤È¸Æ¤Ö¡¥ÃÍ¿Áê¤ËÀ©¸Â¤·¤Ê ¤±¤ì¤Ð¤Ê¤é¤Ê¤¤Íýͳ¤ÏÉûºîÍÑ(7¾Ï»²¾È)¤ò¤â¤Ä¸À¸ìµ¡¹½ ¤È¿¼¤¯´Ø·¸¤¬¤¢¤ë¤Î¤À¤¬¡¤¤³¤³¤Ç¤ÏÀâÌÀ¤·¤Ê¤¤¡¥fourtimes ¤Î¤è¤¦¤ÊÄêµÁ¤Ë ¿ÁêÀ­¤ò»ý¤¿¤»¤ë¤¿¤á¤Ë¤Ï¡¤
# let fourtimes' f = double double f
#   (* equivalent to "let fourtimes' = fun f -> double double f" *) ;;
val fourtimes' : ('a -> 'a) -> 'a -> 'a = <fun>
¤Î¤è¤¦¤Ë¡¤ÌÀ¼¨Åª¤Ë¥Ñ¥é¥á¡¼¥¿¤òƳÆþ¤·¤Æ¡¤´Ø¿ô¼°¤È¤·¤Æ (¤Ä¤Þ¤ê fun ¤ò»È¤Ã¤Æ)ÄêµÁ¤·¤Æ¤ä¤ì¤Ð¤è¤¤¡¥
# fourtimes' (fun x -> x + 1) 3;;
- : int = 7
# fourtimes' (fun s -> "<" ^ s ^ ">") "abc";;
- : string = "<<<<abc>>>>"
¤³¤Î¤è¤¦¤Ë¡¤Ãͤ¬´Ø¿ô¤Ç¤¢¤ë¤è¤¦¤Ê¼°(¤³¤³¤Ç¤Î double double)¤Ë fun x -> ... x ¤ò¤Ä¤±¤ÆÃͤȤ¹¤ë¤è¤¦¤Ê(¥×¥í¥°¥é¥à¤Î)ÊÑ´¹¤ò η-Ÿ³«(η-expansion)¤È¤¤¤¦¡¥

4.2.2  Â¿Áê·¿¤È·¿¿äÏÀ

¤µ¤Æ¡¤¤³¤ì¤Þ¤Ç Objective Caml ¤Ç¤Ï·¿¿äÏÀ¤Îµ¡Ç½¤¬¤¢¤ê¡¤¥×¥í¥°¥é¥Þ¤Ï´Ø¿ô¤Î°ú¿ô¤Î ·¿¤òÆäËÌÀ¼¨Åª¤ËÀë¸À¤·¤Ê¤¯¤Æ¤â¤è¤¤¤³¤È¤Ë¤Ï¿¨¤ì¤¿¤¬¡¤¤½¤ì¤¬¤É¤Î¤è¤¦¤Ê»ÅÁÈ¤ß¤Ç ¼Â¸½¤µ¤ì¤Æ¤¤¤ë¤«¤Ë¤Ä¤¤¤Æ¤Ï¾Ü¤·¤¯½Ò¤Ù¤Ê¤«¤Ã¤¿¡¥¤³¤³¤Ç¤Ï¡¤´Êñ¤Ë·¿¿äÏÀ¤Î »ÅÁȤߤò¸«¤ë¡¥

¤Þ¤º´Êñ¤ÊÎ㤫¤é¹Í¤¨¤Æ¤ß¤è¤¦¡¥fun x -> x + 1 ¤È¤¤¤¦¼°¤Ï¤â¤Á¤í¤ó int -> int ·¿¤ò»ý¤Ä¤ï¤±¤À¤¬¤³¤ì¤¬¤Ê¤¼¤«¹Í¤¨¤Æ¤ß¤ë¤È¡¤¤Ò¤È¤Ä¤Î¹Í¤¨Êý¤È¤·¤Æ ¤È¤¤¤¦¡¤¿äÏÀ¤¬À®¤êΩ¤Ä¡¥Objective Caml ¤Ï¤Þ¤µ¤Ë¤³¤Î¤è¤¦¤Ë·¿¿äÏÀ¤ò¹Ô¤Ã¤Æ¤¤¤ë¡¥ ¤è¤ê¶ñÂÎŪ¤Ë¤Ï¡¤¼°¤ò¥Ü¥È¥à¥¢¥Ã¥×¤Ë¸«¤Æ¤¤¤¯¡¥Äê¿ô 1 ¤Ê¤É¤Ï¤½¤Î·¿¤¬ ¼«ÌÀ¤ËÍ¿¤¨¤é¤ì¡¤ÊÑ¿ô¤Ë´Ø¤·¤Æ¤Ï¤È¤ê¤¢¤¨¤º¡¤Ì¤ÃΤη¿ ¤òɽ¤¹¿·¤·¤¤·¿ÊÑ¿ô¤ò³ä¤êÅö¤Æ¤ë¡¥´Ø¿ôŬÍѤä if¼°¤Ê¤É¡¤ Éôʬ¼°¤«¤é¹½À®¤µ¤ì¤ë¸Ä½ê¤Ç¡¤Éôʬ¼°¤Î·¿¤Ë´Ø¤¹¤ëÀ©Ìó(¡Öx ¤Î·¿ 'a ¤Ï int ¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡×¤Ê¤É)¤ò¹½À®¤·¡¤¤½¤ì¤ò²ò¤¯¡¥¤â¤·¤âÀ©Ì󤬲ò¤±¤Ê¤¤¾ì¹ç¤Ï¡¤ ¤½¤Î¼°¤Ï·¿¤¬¤¢¤Ã¤Æ¤¤¤Ê¤¤¤È·ëÏÀ¤Å¤±¤é¤ì¤ë¡¥À©Ì󤬲ò¤±¤Ê¤¤Îã¤Ï
fun x -> if x then 1 else x
¤ò¹Í¤¨¤ë¤È¤ï¤«¤ë¡¥if¼°¤Î·¿µ¬Â§¤Ï if ľ¸å¤Î¼°¤Ï bool ¤ËÅù¤·¤¯¡¤ thenÀᡤelseÀá¤Î·¿¤âÅù¤·¤¤¡¤¤È¤¤¤¦¤â¤Î¤Ç¤¢¤ë¤«¤é¡¤x ¤Ë³ä¤êÅö¤Æ¤é ¤ì¤¿·¿ÊÑ¿ô¤ò 'a ¤È¤¹¤ë¤È¡¤int = 'a = bool ¤È¤¤¤¦À©Ìó¤¬ÆÀ¤é¤ì¤ë¡¥ ¤³¤ì¤ÏÌÀ¤é¤«¤Ë²ò¤¯¤³¤È¤¬¤Ç¤­¤Ê¤¤¤Î¤Ç¡¤¤³¤Î¼°¤Ï·¿¥¨¥é¡¼¤È¤Ê¤ë¡¥

À©Ìó¤ò²ò¤¤¤Æ¤â·¿ÊÑ¿ô¤¬»Ä¤ë¾ì¹ç¤¬¤¢¤ë¡¥¤³¤Î¼°¤¬Ãͤǡ¤¤«¤Ä let ¤ÇÀë¸À¤µ¤ì¤ë ¤â¤Î¤Ç¤¢¤ì¤Ð¡¤¤³¤Î·¿ÊÑ¿ô¤Ï·¿¥Ñ¥é¥á¡¼¥¿¤È¤·¤Æ(°ÅÌÛ¤ÎÆâ¤Ë)Ãê¾Ý²½¤µ¤ì¤ë¡¥ Î㤨¤Ð¡¤Àè¤Û¤É¤Î apply ¤ÎÀë¸À¤Ï¡¤ f, x ¤Î̤ÃΤη¿¤ò¤½¤ì¤¾¤ì 'a, 'b ¤È¤¹¤ë¤È f x ¤È¤¤¤¦¼°¤«¤é¡¤ f x ¤Î·¿¤ò 'c ¤È¤·¤Æ¡¤'a = 'b -> 'c ¤È¤¤¤¦À©Ìó¤È fun f x -> f x Á´ÂΤη¿ 'a -> 'b -> 'c ¤¬Æ³¤«¤ì¤ë¡¥¤³¤ì¤ò ½ñ¤­´¹¤¨¤Æ¡¤('b -> 'c) -> 'b -> 'c ¤È¤Ê¤ë¡¥

¤Ò¤È¤Ä¤Î¼°¤Ë¤Ï(·¿¥¨¥é¡¼¤òµ¯¤³¤µ¤Ê¤¤ÈϰϤÇ)ÍÍ¡¹¤Ê·¿¤¬³äÅö¤Æ¤é¤ì¤ë²ÄǽÀ­ ¤¬¤¢¤ë¤ï¤±¤À¤¬¡¤¤½¤ì¤é¤Î¸õÊä¤Î¤¦¤Á¤Ë¤Ï¡Ö°ìÈÌÀ­¡¦ÈÆÍÑÀ­¡×¤Î¹â¤¤¤â¤Î¤ÈÄã ¤¤¤â¤Î¤¬¤¢¤ë¡¥Î㤨¤Ð¡¤fst´Ø¿ô¤ËÂФ·¤Æ¤Ï¡¤int * int -> int¡¤float * int -> float¡¤ 'a * 'a -> 'a ¤È¤¤¤Ã¤¿·¿¤¬Í¿¤¨¤é¤ì¤ë¤¬¡¤¤³ ¤ì¤é¤Ï 'a * 'b -> 'a ¤è¤ê¤â(ŬÍѤǤ­¤ë¾ì½ê¤¬¾¯¤Ê¤¤¤È¤¤¤¦°ÕÌ£¤Ç)°ìÈÌ À­¤ÎÄ㤤·¿¤Ç¤¢¤ë¡¥Î㤨¤Ð 'a * 'a -> 'a ¤È¤¤¤¦·¿¤Ï°ú¿ô¤ÎÁȤÎÍ×ÁǤη¿ ¤¬Åù¤·¤¤¤è¤¦¤Ê°ú¿ô¤Ë¤·¤«Å¬ÍѤǤ­¤Ê¤¤¤È¤¤¤¦¡¤ËÜÍè¤Ê¤éÉÔɬÍפÊÀ©¸Â¤¬¤Ä¤¤ ¤Æ¤¤¤ëʬ¡¤'a * 'b -> 'a ¤È¤¤¤¦·¿¤è¤ê¤âÈÆÍÑÀ­¤¬Ä㤤¤È¹Í¤¨¤é¤ì¤ë¡¥ Í¿¤¨¤é¤ì¤¿¼°¤ÎºÇ¤â°ìÈÌŪ¤Ê·¿(¤¬Â¸ºß¤¹¤ë¾ì¹ç¡¤¤½¤Î·¿)¤Î¤³¤È¤ò ¼çÍפʷ¿(principal type)¤È¸Æ¤Ö¡¥ Objective Caml (¤ä Standard ML, Haskell) ¤Ç¤Ï¡¤Í¿¤¨¤é¤ì¤¿¼°¤Ë¤Ï¾ï¤Ë¼çÍפʷ¿¤¬Â¸ºß¤¹¤ë¤³¤È¤¬Êݾڤµ¤ì¤Æ ¤ª¤ê¡¤¤Þ¤¿¡¤·¿¿äÏÀ¥¢¥ë¥´¥ê¥º¥à¤Ï¡¤¾å¤Ç½Ò¤Ù¤¿¤è¤¦¤ÊÊýË¡¤Ç¡¤ ¼çÍפʷ¿¤ò¾ï¤Ëµá¤á¤ë¤³¤È¤¬¤Ç¤­¤ë¤È¤¤¤¦¡¤Îɤ¤À­¼Á¤ò»ý¤Ã¤Æ¤¤¤ë¡¥
·¿¿äÏÀ¤ÎĹ½ê¡¦Ã»½ê ¤È¤³¤í¤Ç¡¤·¿¿äÏÀ¤ÏÊÑ¿ô¤Î·¿Àë¸À¤ò¾Ê¤±¤ë°ìÊý¡¤·¿Àë¸À¤½¤Î¤â¤Î¤Ï¥×¥í¥°¥é¥à ¤òÆɤà¾å¤Ç¤âÍ­ÍѤʤâ¤Î¤Ç¤¢¤ë¡¥¤É¤Î¤è¤¦¤Ê¾ì¹ç¤ËÀë¸À¤ò¤¹¤Ù¤­/¤·¤Ê¤¤¤Ù¤­ ¤«¤Ï¡¤¼ñÌ£¤ÎÌäÂê¤Ç¤¢¤ëÉôʬ¤â¤¢¤ë¤¬¡¤¹â³¬´Ø¿ô/ƿ̾´Ø¿ô¤ò»È¤¦¤è¤¦¤Ë¤Ê¤ë ¤È¡¤·¿¤¬Ê¸Ì®¤«¤é¼«ÌÀ¤Ê¾ì¹ç¤¬Â¿¤¯¸½¤ì¤ë¡¥¤¿¤È¤¨¤Ð¡¤Àè¤Û¤É¤Î Newton-Raphson Ë¡¤Ç¡¤
let square_root x = newton_method (fun y -> y *. y -. x) 1.0;;
¤Î¤è¤¦¤Ë¹â³¬´Ø¿ô newton_method ¤Ë¡¤Æ¿Ì¾´Ø¿ô¤òÅϤ·¤Æ¤¤¤ë¡¥ newton_method ¤Î·¿¤«¤éƿ̾´Ø¿ô¤Î¥Ñ¥é¥á¡¼¥¿ y ¤Î·¿¤¬ float ¤Ç ¤¢¤ë¤³¤È¤Ï¤¹¤°¤ï¤«¤ë¡¥¤³¤³¤Ç¡¤¤ï¤¶¤ï¤¶ fun (y : float) -> ... ¤È ½ñ¤«¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤È¤·¤¿¤é·ë¹½ÌÌÅݤǤ¢¤ë¡¥

¤Þ¤¿¡¤¼çÍפʷ¿¤òµá¤á¤ë°ìÈֳμ¤ÊÊýË¡¤Ï¡¤·¿Àë¸À¤ò¤·¤Ê¤¤¤³¤È¤Ç¤¢¤ë¡¥Àè¤Û ¤É¤Î fst ¤ò
# let fst ((x, y) : 'a * 'a) = x;;
val fst : 'a * 'a -> 'a = <fun>
¤ÈÀë¸À¤·¤Æ¤â¡¤·¿¥Á¥§¥Ã¥¯¤òÄ̲᤹¤ë¤¬¡¤ÁȤÎÍ×ÁǤ¬Æ±¤¸·¿¤ò»ý¤¿¤Ê¤¯¤Æ¤Ï¤Ê ¤é¤Ê¤¤¤È¤¤¤¦¡¤°ìÈÌÀ­¤ò·ç¤¯ÄêµÁ¤Ë¤Ê¤Ã¤Æ¤·¤Þ¤¦¡¥
# fst (true, 3.2);;
 fst (true, 3.2);;
 ^^^^^^^^^^^
This expression has type bool * float but is here used with type bool * bool
¤³¤ÎÈ¿ÌÌ¡¤ML·¿¿äÏÀ¤Ï¡¤·¿¸¡ºº¤Ë¤è¤ë¥¨¥é¡¼¤¬»×¤ï¤Ì¤È¤³¤í¤ÇÊó¹ð¤µ¤ì¤ë¡¤ ¤È¤¤¤¦·çÅÀ¤¬¤¢¤ë¡¥Î㤨¤Ð¡¤Á°¤ÎÎã¤ÎÊÑ·Á¤À¤¬¡¤
# fun x -> (x 1, x true);;
 fun x -> (x 1, x true);;
 ^^^^
This expression has type bool but is here used with type int
¤Ç¡¤x true ¤Ç¥¨¥é¡¼¤¬Êó¹ð¤µ¤ì¤Æ¤¤¤ë¤¬¡¤¤â¤·¤«¤¹¤ë¤È¡¤x 1 ¤Ç1 ¤ò ÅϤ·¤Æ¤¤¤ëÉôʬ¤Ç´Ö°ã¤¨¤¿¤Î¤«¤â¤·¤ì¤Ê¤¤¡¥ÆäËÄêµÁ¤¬Â礭¤¯¤Ê¤êx 1 ¤È x true ¤¬Î¥¤ì¤Æ¤¤¤ë¤è¤¦¤Ê¾ì¹ç¡¤¡ÖËÜÅö¤Ë´Ö°ã¤¨¤¿¤È¤³¤í¡×¤ò°ìÌܤÇõ ¤¹¤Î¤¬Æñ¤·¤¤¾ì¹ç¤¬¤¢¤ë¡¥¤³¤ì¤Ï¡¤¤·¤Ð¤·¤Ð ML ¤Î·¿¿äÏÀ¤Î·çÅÀ¤È¤·¤Æ»ØŦ¤µ ¤ì¤ëÅÀ¤Ç¤¢¤ë¡¥(½ÏÎý¤·¤¿ Objective Caml ¥×¥í¥°¥é¥Þ¤Ï¡¤·¿¿äÏÀ¤¬¤É¤Î¤è¤¦¤Ë¤·¤Æ ¹Ô¤Ê¤ï¤ì¤ë¤«¤òÍý²ò¤·¤Æ¤¤¤ë¤¿¤á¡¤¤½¤ì¤Û¤ÉÏǤ蘆¤ì¤º¤ËËÜÅö¤Î¥¨¥é¡¼²Õ½ê¤ò õ¤·¤¢¤Æ¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥) ¤³¤ì¤ËÂФ·¡¤x ¤Î·¿¤òÀë¸À¤·¡¤
# fun (x: bool -> 'a) -> (x 1, x true);;
 fun (x: bool -> 'a) -> (x 1, x true);;
 ^
This expression has type int but is here used with type bool
¤È¤¹¤ì¤Ð¡¤x ¤Î¼è¤ë°ú¿ô¤Î·¿¤¬Í½¤á¤ï¤«¤Ã¤Æ¤¤¤ë¤Î¤Ç¡¤x 1 ¤ÎÉôʬ¤Ç¥¨¥é¡¼ ¤¬Êó¹ð¤µ¤ì¤ë¡¥

4.2.3  Case Study: ¥³¥ó¥Ó¥Í¡¼¥¿

¡Ö·×»»¡×¤È¤¤¤¦³µÇ°¤Î¥â¥Ç¥ë¤È¤·¤Æ´ðËÜŪ¤Ê¤â¤Î¤Ë¥Á¥å¡¼¥ê¥ó¥°µ¡³£¤¬¤¢¤ë¡¥ ¥Á¥å¡¼¥ê¥ó¥°µ¡³£¤Ï¡¤CPU¤¬¥á¥â¥ê¤ÎÆɤ߽ñ¤­¤ò¤·¤Ê¤¬¤é·×»»¤ò¿Ê¤á¤Æ¹Ô¤¯ ÍͻҤòñ½ã²½¤·¤¿¤â¤Î¤Ç¤¢¤ë¡¥¤³¤ì¤ËÂФ·¤Æ¡¤´Ø¿ô·¿¥×¥í¥°¥é¥ß¥ó¥°¤Î·×»» ¤ò¥â¥Ç¥ë²½¤·¤¿¤â¤Î¤Ë λ·×»»¡¤¥³¥ó¥Ó¥Í¡¼¥¿ÍýÏÀ¤È¤¤¤Ã¤¿¤â¤Î¤¬¤¢¤ë¡¥ λ·×»»¤ÎÂηϤϴؿôŬÍѤˤª¤±¤ë¥Ñ¥é¥á¡¼¥¿¤Î°ú¿ô¤ÎÃÖ´¹¤ò¥â¥Ç¥ë²½¤· ¤¿¤â¤Î¤Ç¡¤Ê£»¨¤Ê·×»»¤â´Ø¿ôÃê¾Ý¼°(Objective Caml ¤Î fun ¼°)¤È´Ø¿ôŬÍѤÎÁȤ߹ç¤ï¤» ¤Î¤ß¤Çɽ¤¹¤³¤È¤¬¤Ç¤­¤ë¡¥¥³¥ó¥Ó¥Í¡¼¥¿ÍýÏÀ¤Ï¡¤λ·×»»¤ÎÍýÏÀ¤È Ì©Àܤ˴ؤï¤Ã¤Æ¤¤¤Æ¡¤¥³¥ó¥Ó¥Í¡¼¥¿¤È¸Æ¤Ð¤ì¤ë¤¤¤¯¤Ä¤«¤Î¡Ö´Ø¿ô¤òÁȤ߹ç¤ï¤»¤Æ¿·¤·¤¤ ´Ø¿ô¤ò¹½À®¤¹¤ë¡×¹â³¬´Ø¿ô¤ÎÁȹç¤ï¤»¤Ç¡¤Ê£»¨¤Ê·×»»¤òɽ¸½¤¹¤ë¤â¤Î¤Ç¤¢¤ë¡¥ ¤³¤³¤Ç¤Ï´Êñ¤Ë¥³¥ó¥Ó¥Í¡¼¥¿¤Ë¤Ä¤¤¤Æ¤ß¤Æ¤¤¤¯¡¥

ºÇ¤â¤è¤¯ÃΤé¤ì¤¿¥³¥ó¥Ó¥Í¡¼¥¿¤Î¤Ò¤È¤Ä¤Ï¿ô³Ø¤Ç»È¤¦´Ø¿ô¹çÀ® fg (⤷¡¤(fg)(x) = f(g(x)) ¤È¤¹¤ë)¤òɽ¤¹ ∘ ¤Ç¤¢¤ë¡¥¤³¤ì¤Ï¡¤´Ø¿ô f, g ¤«¤é¤½¤ì¤é¤ò¹çÀ®¤·¤¿´Ø¿ô¤ò¹½À®¤¹¤ë ¥³¥ó¥Ó¥Í¡¼¥¿¤È¹Í¤¨¤é¤ì¤ë¡¥∘ ¤òÃæÃֱ黻»Ò$¤Ç ɽ¸½¤¹¤ë¤³¤È¤Ë¤¹¤ë¤È¡¤
let ($) f g x = f (g x);;
val ( $ ) : ('a -> 'b) ->  ('c -> 'a) -> 'c -> 'b = <fun>
¤Èɽ¸½¤µ¤ì¤ë¡¥Î㤨¤Ð¡¤Æó¤Ä¤Î´Ø¿ô¤ÎÁȹç¤ï¤»¤«¤é¤Ê¤ë´Ø¿ô
fun x -> ~-. (sqrt x)
¤Ï¡¤
# let f = ( ~-. ) $ sqrt;;
val f : float -> float = <fun>
# f 2.0;;
- : float = -1.41421356237309515
¤È¤¤¤¦¼°¤Çɽ¸½¤Ç¤­¤ë¡¥(~-. ¤Ï¼Â¿ôÃͤÎÉä¹æ¤òµÕž¤µ¤»¤ëñ¹à±é»»»Ò¤Ç¤¢ ¤ë¡¥)¥³¥ó¥Ó¥Í¡¼¥¿¤Î¥Ý¥¤¥ó¥È¤Ï¡¤ÌÀ¼¨Åª¤Ë¥Ñ¥é¥á¡¼¥¿¤òƳÆþ¤¹¤ë¤³¤È¤Ê¤¯¡¤ ñ½ã¤Ê´Ø¿ô¤òÁȤ߹ç¤ï¤»¤Æ¤è¤êÊ£»¨¤Ê´Ø¿ô¤ò¹½À®¤Ç¤­¤ë¤È¤³¤í¤Ë¤¢¤ë¡¥

¤â¤Ã¤È¤âñ½ã¤Ê¥³¥ó¥Ó¥Í¡¼¥¿¤ÏÀè¤Ë¸«¤¿ id ¤Ç¤¢¤ë¡¥(¥³¥ó¥Ó¥Í¡¼¥¿ÍýÏÀ¤Ç¤Ï I ¥³¥ó¥Ó¥Í¡¼¥¿¤È¸Æ¤Ð¤ì¤ë¡¥) id f ¤Ï f ¤ÈƱ¤¸´Ø¿ô¤òɽ¸½¤¹¤ë¡¥¤Þ¤¿ I ¥³¥ó¥Ó¥Í¡¼¥¿¤Ï´Ø¿ô¹çÀ®¤ÈÁȤ߹ç¤ï¤»¤Æ¤â²¿¤âµ¯¤é¤Ê¤¤¡¥
# (sqrt $ id) 3.0
#    (* Without (), it would be equivalent to sqrt $ (id 3.0) *)
# ;;
- : float = 1.73205080756887719
# (id $ sqrt) 3.0;;
- : float = 1.73205080756887719
K ¥³¥ó¥Ó¥Í¡¼¥¿¤ÏÄê¿ô´Ø¿ô¤ò¹½À®¤¹¤ë¤¿¤á¤Î¥³¥ó¥Ó¥Í¡¼¥¿¤Ç¤¢¤ê¡¤°Ê²¼¤Î´Ø¿ô ¤Çɽ¸½¤µ¤ì¤ë¡¥
# let k x y = x;;
val k : 'a -> 'b -> 'a = <fun>
k x ¤Ï²¿¤ËŬÍѤ·¤Æ¤â x ¤òÊÖ¤¹´Ø¿ô¤Ë¤Ê¤ë¡¥
# let const17 = k 17 in const17 4.0;;
- : int = 17
¼¡¤Î S ¥³¥ó¥Ó¥Í¡¼¥¿¤Ï´Ø¿ô¹çÀ®¤Î ∘ ¤ò°ìÈ̲½¤·¤¿¤â¤Î¤Ç¤¢¤ë¡¥
# let s x y z = x z (y z);;
val s : ('a -> 'b -> 'c) -> ('a -> 'b) -> 'a -> 'c = <fun>
Objective Caml ¤Ç fun ¼°¤È´Ø¿ôŬÍѤÎÁȹç¤ï¤»¡Ö¤Î¤ß¡×¤Çɽ¸½¤Ç¤­¤ë´Ø¿ô (fun x -> x, fun x y -> x (x y) ¤Ê¤É)¤Ï S¤È K ¤ÎÁȹç¤ï¤»¤Î ¤ß¤Çɽ¸½¤Ç¤­¤ë¤³¤È¤¬ÃΤé¤ì¤Æ¤¤¤ë¡¥¤³¤ì¤é¤Ï¡¤Ã±½ã·¿ÉÕ¤­λ·×»» ¤Çɽ¸½¤Ç¤­¤ë´Ø¿ô¤Î¥¯¥é¥¹¤ÈƱ¤¸¤Ç¤¢¤ë¡¥Î㤨¤ÐI¥³¥ó¥Ó¥Í¡¼¥¿¤Ï S K K ¤È¤·¤Æɽ¤»¤ë¡¥
# s k k 5;;
- : int = 5
(ÉÔÆ°ÅÀ¥³¥ó¥Ó¥Í¡¼¥¿¤òƳÆþ¤·¤¿)¥³¥ó¥Ó¥Í¡¼¥¿¡¤(·¿¤Ê¤·¤Î) λ·×»»¤Ï¥Á¥å¡¼¥ê¥ó¥°µ¡³£¤ÈƱÄøÅÙ¤Îɽ¸½ÎϤ¬¤¢¤ë ·×»»¥â¥Ç¥ë¤Ç¤¢¤ë¤³¤È¤¬ÃΤé¤ì¤Æ¤¤¤ë¡¥

4.2.4  Îý½¬ÌäÂê



Exercise 4  °Ê²¼¤Î´Ø¿ô curry ¤Ï¡¤Í¿¤¨¤é¤ì¤¿´Ø¿ô¤ò¥«¥ê¡¼²½¤¹¤ë´Ø¿ô¤Ç¤¢¤ë¡¥

# let curry f x y = f (x, y);;
val curry : ('a * 'b -> 'c) -> 'a -> 'b -> 'c = <fun>
# let average (x, y) = (x +. y) /. 2.0;;
val average : float * float -> float = <fun>
# let curried_avg = curry average;;
val curried_avg : float -> float -> float = <fun>
# average (4.0, 5.3);;
- : float = 4.65
# curried_avg 4.0 5.3;;
- : float = 4.65
¤³¤ÎµÕ¡¤¤Ä¤Þ¤ê (2°ú¿ô¤Î)¥«¥ê¡¼²½´Ø¿ô¤ò¼õ¤±¼è¤ê¡¤Æó¤ÄÁȤò¼õ¤±¼è¤ë´Ø¿ô¤Ë ÊÑ´¹¤¹¤ë uncurry ´Ø¿ô¤òÄêµÁ¤»¤è¡¥

# let avg = uncurry curried_avg in
#   avg (4.0, 5.3);;
- : float = 4.65


Exercise 5   °Ê²¼¤Î´Ø¿ô repeat ¤Ï double, fourtimes ¤Ê¤É¤ò°ìÈ̲½¤·¤¿¤â¤Î¤Ç¡¤ f ¤ò n ²ó¡¤x ¤ËŬÍѤ¹¤ë´Ø¿ô¤Ç¤¢¤ë¡¥

# let rec repeat f n x =
#   if n > 0 then repeat f (n - 1) (f x) else x;;
val repeat : ('a -> 'a) -> int -> 'a -> 'a = <fun>
¤³¤ì¤ò»È¤Ã¤Æ¡¤¥Õ¥£¥Ü¥Ê¥Ã¥Á¿ô¤ò·×»»¤¹¤ë´Ø¿ô fib ¤òÄêµÁ¤¹¤ë¡¥ °Ê²¼¤Î ... ¤ÎÉôʬ¤òËä¤á¤è¡¥

let fib n = 
  let (fibn, _) = ...
  in fibn;;


Exercise 6   ¼¡¤Î´Ø¿ô funny ¤¬¤É¤Î¤è¤¦¤ÊƯ¤­¤ò¤¹¤ë¤«ÀâÌÀ¤»¤è¡¥

# let rec funny f n = 
#   if n = 0 then id
#   else if n mod 2 = 0 then funny (f $ f) (n / 2)
#   else funny (f $ f) (n / 2) $ f;;
val funny : ('a -> 'a) -> int -> 'a -> 'a = <fun>


Exercise 7  s k k ¤¬¹±Åù´Ø¿ô¤È¤·¤ÆƯ¤¯Íýͳ¤ò s k k 1 ¤¬É¾²Á¤µ¤ì¤ë ·×»»¥¹¥Æ¥Ã¥×¤ò¼¨¤¹¤³¤È¤Ç¡¤ÀâÌÀ¤»¤è¡¥

¤Þ¤¿¡¤fun x y -> y
¤ÈƱÍͤËƯ¤¯´Ø¿ô¤ò¡¤¥³¥ó¥Ó¥Í¡¼¥¿ s ¤È k ¤ò ´Ø¿ôŬÍѤΤߤÇ(fun ¤ä let ¤Ë¤è¤ë´Ø¿ôÄêµÁ¤ò»È¤ï¤º¤Ë) ÁȤ߹ç¤ï¤»¤¿·Á¤Çɽ¸½¤»¤è¡¥

# ( (* s, k ¤ò ´Ø¿ôŬÍѤÇÁȤ߹ç¤ï¤»¤¿¼° *) ) 1 2;;
- : int = 2


Exercise 8   double double f x ¤¬ f (f (f (f x))) ¤È¤·¤ÆƯ¤¯Íýͳ¤òÁ°Ìä ¤ÈƱÍͤˤ·¤ÆÀâÌÀ¤»¤è¡¥



1
´Ø¿ô̾¤ò¹Í¤¨¤ë¤Î¤Ã¤ÆÌÌÅݤ¸¤ã¤¢¤ê¤Þ¤»¤ó¤«¡©
2
¤³¤Î¹Í¤¨¤Ï Schönfinkel ¤È¤¤¤¦¿Í¤¬È¯¸«¤·¤¿ ¤é¤·¤¤¤¬¤Ê¤¼¤¬ Curry ²½¤È¸Æ¤Ð¤ì¤Æ¤¤¤ë¡¥
3
¼Â¤Ï¡¤¸½ºß±é½¬¤Ç»ÈÍѤ·¤Æ ¤¤¤ë¥Ð¡¼¥¸¥ç¥ó 3.08.1¤Ç¤Ï¡¤¤â¤¦¾¯¤·À©¸Â¤¬´Ë¤¯¤Ê¤Ã¤Æ¤¤¤Æ¡¤ÃͤȤ¢¤ë¼ï ¤Î·¿¤ò»ý¤Ä¼°¤Ë¿ÁêÀ­¤¬µö¤µ¤ì¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤¬¡¤¤³¤³¤Ç¤ÏºÙ¤«¤¯¤Ï¿¨ ¤ì¤Ê¤¤¡¥

Previous Up Next