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
¤µ¤Æ¡¤´Ø¿ô 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 ¤Ê¤É¤ÎÁ°¾Ï¤Þ¤Ç¤Ë
ÃæÃֱ黻»Ò¤È¤·¤Æ¾Ò²ð¤·¤¿¥¡¼¥ï¡¼¥É¡¤¤â¤·¤¯¤Ï
-
1ʸ»úÌܤ¬ =, <, >, @, ^, |, &, +, -, *, /,
$, % ¤Î¤¤¤º¤ì¤«¤Ç¡¤
- 2ʸ»úÌܰʹߤ¬ !, $, %, *, +, -, ., /, :, <, =,
>, ?, @, ^, |~ ¤Î¤¤¤º¤ì¤«
¤òËþ¤¿¤¹Ê¸»úÎó¤Ç¤¢¤ë¡¥
ÄêµÁ¤ò¤¹¤ë¤Ë¤Ï (〈 ÃæÃֱ黻»Ò 〉) ¤òÉáÄ̤Î̾Á°¤À¤È»×¤Ã¤Æ¹Ô¤¦¡¥
# 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
Á°Ãֱ黻»Ò¤Ï -, -. ¤â¤·¤¯¤Ï
-
1ʸ»úÌܤ¬ !, ?, ~ ¤Î¤¤¤º¤ì¤«¤Ç¡¤
- 2ʸ»úÌܰʹߤ¬ !, $, %, *, +, -, ., /, :, <, =,
>, ?, @, ^, |~ ¤Î¤¤¤º¤ì¤«
¤«¤é¤Ê¤ëʸ»úÎó¤Ç¤¢¤ë¡¥°ì¸«¡¤Á°Ãֱ黻»Ò¤Ï´Ø¿ô¤Î̾Á°¤È¤·¤Æµ¹æ¤¬»È¤¦¤¿¤á
¤Î¤â¤Î¤À¤±¤Î¤è¤¦¤Ë¸«¤¨¤ë¤¬¡¤¼ÂºÝ¤Ï¹½Ê¸²òÀϤǰ㤤¤¬¸½¤ì¤ë¡¥
Á°Ãֱ黻»Ò¤ÏÄ̾ï¤Î´Ø¿ôŬÍѤè¤ê¤â
·ë¹ç¤ÎÍ¥ÀèÅÙ¤¬¹â¤¯¡¤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(a) = a ¤Ê¤ë a) ¤òµá¤á¤ë¡¥(¤â¤·¤¯¤Ï
Á²²½¼° xn = xn−1 − f(xn−1) / f'(xn−1) ¤Î
¶Ë¸Â¤òµá¤á¤ë¡¥)
¤³¤ì¤ò²ò¤¯¥×¥í¥°¥é¥à¤ò¹Í¤¨¤Æ¤ß¤è¤¦¡¥¤Þ¤º¡¤Èùʬ¤ò¤É¤¦É½¸½¤¹¤ë¤«¤Ç¤¢¤ë¤¬¡¤
¶á»÷Ū¤Ë¡¤¤È¤Æ¤â¾®¤µ¤¤Äê¿ô 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
Exercise 1 ¼Â¿ô¾å¤Î´Ø¿ô f ¤ËÂФ·¤Æ ∫abf(x)dx ¤ò·×»»¤¹
¤ë´Ø¿ô integral f a b ¤òÄêµÁ¤»¤è¡¥¤Þ¤¿¤³¤ì¤ò»È¤Ã¤Æ¡¤
∫0πsinx dx ¤ò·×»»¤»¤è¡¥
¶á»÷Ū¤Ê·×»»ÊýË¡¤È¤·¤Æ¡¤¤³¤³¤Ç¤ÏÂæ·Á¶á»÷¤òÀâÌÀ¤¹¤ë¤¬Â¾¤ÎÊýË¡¤Ç¤âÎɤ¤¡¥
Âæ·Á¸ø¼°¤Ç¤Ï b−a ¤ò 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¤Ä¤Î·¿
-
int -> int -> int -> int
- (int -> int) -> int -> int
- (int -> int -> int) -> int
¤Î°ã¤¤¤òÀâÌÀ¤»¤è¡¥¤Þ¤¿¡¤³Æ·¿¤Ë°¤¹¤ëŬÅö¤Ê´Ø¿ô¤òÄêµÁ¤»¤è¡¥
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
·¿¤ò»ý¤Ä¤ï¤±¤À¤¬¤³¤ì¤¬¤Ê¤¼¤«¹Í¤¨¤Æ¤ß¤ë¤È¡¤¤Ò¤È¤Ä¤Î¹Í¤¨Êý¤È¤·¤Æ
-
+ ¤Ï int -> int -> int ·¿¤À¤«¤éξÊÕ¤Ë int ¤¬Íè¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
- x ¤Î·¿¤ÏÍ¿¤¨¤é¤ì¤Æ¤¤¤Ê¤¤¤¬¡¤+ ¤Îº¸Â¦¤Ë¤¢¤ë¤«¤é¡¤x ¤Ï int ¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤Ï¤º¤À¡¥1 ¤âƱÍÍ¤Ë int ¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤¬¡¤¤³¤ì¤ÏOK¤À¡¥
- x ¤¬ int ¤Ç¤¢¤ë¤È²¾Äꤹ¤ì¤Ð¡¤x + 1 ¤Ï int ¤Ë¤Ê¤ë¡¥
- x + 1 ¤ò int ¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤ x ¤ÇÃê¾Ý²½¤¹¤ë¤«¤é¡¤Á´ÂΤη¿¤Ï
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 ¼°)¤È´Ø¿ôŬÍѤÎÁȤ߹ç¤ï¤»
¤Î¤ß¤Çɽ¤¹¤³¤È¤¬¤Ç¤¤ë¡¥¥³¥ó¥Ó¥Í¡¼¥¿ÍýÏÀ¤Ï¡¤λ·×»»¤ÎÍýÏÀ¤È
Ì©Àܤ˴ؤï¤Ã¤Æ¤¤¤Æ¡¤¥³¥ó¥Ó¥Í¡¼¥¿¤È¸Æ¤Ð¤ì¤ë¤¤¤¯¤Ä¤«¤Î¡Ö´Ø¿ô¤òÁȤ߹ç¤ï¤»¤Æ¿·¤·¤¤
´Ø¿ô¤ò¹½À®¤¹¤ë¡×¹â³¬´Ø¿ô¤ÎÁȹç¤ï¤»¤Ç¡¤Ê£»¨¤Ê·×»»¤òɽ¸½¤¹¤ë¤â¤Î¤Ç¤¢¤ë¡¥
¤³¤³¤Ç¤Ï´Êñ¤Ë¥³¥ó¥Ó¥Í¡¼¥¿¤Ë¤Ä¤¤¤Æ¤ß¤Æ¤¤¤¯¡¥
ºÇ¤â¤è¤¯ÃΤé¤ì¤¿¥³¥ó¥Ó¥Í¡¼¥¿¤Î¤Ò¤È¤Ä¤Ï¿ô³Ø¤Ç»È¤¦´Ø¿ô¹çÀ®
f ∘ g (⤷¡¤(f ∘ g)(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
(ÉÔÆ°ÅÀ¥³¥ó¥Ó¥Í¡¼¥¿¤òƳÆþ¤·¤¿)¥³¥ó¥Ó¥Í¡¼¥¿¡¤(·¿¤Ê¤·¤Î)
λ·×»»¤Ï¥Á¥å¡¼¥ê¥ó¥°µ¡³£¤ÈÆ±ÄøÅÙ¤Îɽ¸½ÎϤ¬¤¢¤ë
·×»»¥â¥Ç¥ë¤Ç¤¢¤ë¤³¤È¤¬ÃΤé¤ì¤Æ¤¤¤ë¡¥
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¤Ç¤Ï¡¤¤â¤¦¾¯¤·À©¸Â¤¬´Ë¤¯¤Ê¤Ã¤Æ¤¤¤Æ¡¤ÃͤȤ¢¤ë¼ï
¤Î·¿¤ò»ý¤Ä¼°¤Ë¿ÁêÀ¤¬µö¤µ¤ì¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤¬¡¤¤³¤³¤Ç¤ÏºÙ¤«¤¯¤Ï¿¨
¤ì¤Ê¤¤¡¥