Previous Up Next

Chapter 5  ºÆµ¢ÅªÂ¿ÁêŪ¥Ç¡¼¥¿¹½Â¤: ¥ê¥¹¥È

¤³¤ì¤Þ¤Ç¡¤¹½Â¤¤Î¤¢¤ë¥Ç¡¼¥¿¤òɽ¸½¤¹¤ë¤¿¤á¤Î¼êÃʤȤ·¤Æ¤ÏÁÈ ¤òÍѤ¤¤Æ¤­¤¿¡¥¤³¤³¤Ç¤Ï¥ê¥¹¥È(lists)¤È¤¤¤¦¡¤ ¡Ö¥Ç¡¼¥¿¤Î(Í­¸Â)Îó¡×¤òɽ¸½¤¹¤ë¥Ç¡¼¥¿¹½Â¤¤ò¤ß¤Æ¤¤¤¯¡¥ ¥ê¥¹¥È¤Ï¹½Â¤¼«ÂΤ¬ºÆµ¢Åª¤Ç¤¢¤ë¡¥¤Þ¤¿¡¤³ÊǼ¤¹¤ë¥Ç¡¼¥¿¤Î¼ïÎà ¤¬ÊѤï¤ê¤¦¤ë¤È¤¤¤¦°ÕÌ£¤Ç¿ÁêŪ¤Ç¤¢¤ë¤È¤¤¤¦ÆÃħ¤ò¤â¤Ã¤Æ¤¤¤ë¡¥

5.1  ¥ê¥¹¥È¤Î¹½À®Ë¡

¤Þ¤º¤Ï´Êñ¤Ê¥ê¥¹¥È¤ÎÎã¤ò¸«¤Æ¤ß¤è¤¦¡¥¥ê¥¹¥È¤Ï¥Ç¡¼¥¿Îó¤ò¹½À®¤¹¤ë Í×ÁǤò ; ¤Ç¶èÀڤꡤ[]¤Ç°Ï¤à¤³¤È¤Ç¹½À®¤µ¤ì¤ë¡¥

# [3; 9; 0; -10];;
- : int list = [3; 9; 0; -10]
# let week = ["Sun"; "Mon"; "Tue"; "Wed"; "Thu"; "Fri"; "Sat"];;
val week : string list = ["Sun"; "Mon"; "Tue"; "Wed"; "Thu"; "Fri"; "Sat"]

¥ê¥¹¥È¤Î¼°¤Ë¤Ï “⟨ Í×ÁǤη¿ ⟩ list” ¤È¤¤¤¦ ·¿¤¬Í¿¤¨¤é¤ì¤ë¡¥¤³¤ì¤¬°ÕÌ£¤¹¤ë¤Î¤Ï¡Ö(Objective Caml ¤Ç¤Ï)°ì¤Ä¤Î ¥ê¥¹¥È¤ËʤÖÍ×ÁǤη¿¤ÏƱ¤¸¡×¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¤¤È¤¤¤¦ ¤³¤È¤Ç¤¢¤ë¡¥¤Þ¤¿Ê̤θ«Êý¤ò¤¹¤ë¤È¡¤¥ê¥¹¥È¼°¤Ï¤½¤ÎÎó¤ÎŤµ¤Ë´Ø¤ï¤é¤º¡¤Í× ÁǤη¿¤¬Æ±¤¸¤Ç¤¢¤ì¤Ð¡¤Æ±¤¸¥ê¥¹¥È·¿¤Ë°¤¹¤ë¤È¤¤¤¦¤³¤È¤Ç¤¢¤ë¡¥

# [1; 'a'];;
 [1; 'a'];;
^^^
This expression has type char but is here used with type int
# (* compare with the type of [3; 9; 0; -10] *)
  [-3];;
- : int list = [-3]

¤³¤Î¤³¤È¤ÏÁȤȥꥹ¥È¤Î·èÄêŪ¤Ê°ã¤¤¤Ç¤¢¤ë¤Î¤ÇÃí°Õ¤¹¤ë¤³¤È¡¥ ÁȤη¿¤Ï³ÆÍ×ÁǤη¿¤òʤ٤뤳¤È¤Çµ­½Ò¤µ¤ì¤ë¤¿¤á¡¤³ÆÍ×ÁǤη¿¤Ï °Û¤Ã¤Æ¤â¤è¤¤¤¬¡¤Â礭¤µ¤Î°ã¤¦ÁȤÏƱ¤¸·¿¤Ë°¤·ÆÀ¤Ê¤¤(¤¹¤Ê¤ï¤Á¡¤ ÁȤÎÂ礭¤µ¤Î¾ðÊ󤬷¿¤Ë¸½¤ì¤Æ¤¤¤ë)¡¥

¥ê¥¹¥È¤Î¹½Â¤¤Ï¡¤ÁȤΤ褦¤Ë¡ÖÍ×ÁǤòʤ٤¿¤â¤Î¡×¤È»×¤¦Âå¤ê¤Ë¡¤ °Ê²¼¤Î¤è¤¦¤ËºÆµ¢Åª¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤ë¹½Â¤¤È¤â¹Í¤¨¤é¤ì¤ë¡¥¤Ä¤Þ¤ê

¤ÈÄêµÁ¤¹¤ë¤³¤È¤â¤Ç¤­¤ë¡¥¤³¤ÎÄêµÁ¤ÏÆóÈÖÌܤÎÀ᤬ºÆµ¢Åª¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡¥ :: ¤Î¤³¤È¤òcons ¥ª¥Ú¥ì¡¼¥¿(¤Þ¤¿¤Ïñ¤Ë cons)¤È¸Æ¤Ö¤³¤È¤â¤¢¤ë¡¥ ¤³¤Î¤è¤¦¤Ë¥ê¥¹¥È¤ò¹½ÃÛ¤¹¤ëÎã¤ò¸«¤Æ¤ß¤è¤¦¡¥

# let oddnums = [3; 9; 253];;
val oddnums : int list = [3; 9; 253]
# let more_oddnums = 99 :: oddnums;;
val more_oddnums : int list = [99; 3; 9; 253]
# (* :: is right associative, that is, e1 :: e2 :: l = e1 :: (e2 :: l) *)
  let evennums = 4 :: 10 :: [256; 12];;
val evennums : int list = [4; 10; 256; 12]
# [];;
- : 'a list = []

Í×ÁǤòÎóµ­¤¹¤ëÊýË¡¤È :: ¤òÍѤ¤¤ëÊýË¡¤òº®¤¼¤ë¤³¤È¤â¤Ç¤­¤ë¡¥ evennums ¤ÎÎã¤Ë¸«¤ë¤è¤¦¤Ë¡¤:: ¤Ï±¦·ë¹ç¤¹¤ë(e1 :: e2 :: l ¤Ï e1 :: (e2 :: l) ¤ÈÆɤà)¡¥ ¶õ¥ê¥¹¥È [] ¤ÏÍ×ÁǤ¬¤Ê¤¯¡¤¤É¤Î¤è¤¦¤ÊÍ×ÁÇ ¤Î¥ê¥¹¥È¤È¤â¸«¤Ê¤»¤ë¤³¤È ¤¬¤Ç¤­¤ë¤¿¤á¡¤'a list ¤È¤¤¤¦Â¿Áê·¿¤¬Í¿¤¨¤é ¤ì¤Æ¤¤¤ë¡¥¤â¤Á¤í¤ó¡¤¶õ¥ê¥¹¥È¤Ë¤ÏÍÍ¡¹¤Ê·¿¤ÎÍ×ÁǤòÄɲ乤뤳¤È¤¬¤Ç¤­¤ë¡¥

# let boollist = true :: false :: [];;
val boollist : bool list = [true; false]
# let campuslist = "Yoshida" :: "Uji" :: "Katsura" :: [];;
val campuslist : string list = ["Yoshida"; "Uji"; "Katsura"]

¤Á¤Ê¤ß¤Ë Objective Caml ¤Ç¤Ï¡ÖÍ×ÁǤòʤ٤ë¡×ÄêµÁ¤Ï¡¤(ÆâÉôŪ¤Ë¤Ï)ºÆµ¢Åª¤ÊÄêµÁ¤Î άµ­Ë¡¤Ç¤¢¤ë¡¥¤Ä¤Þ¤ê¡¤

[e1; e2; ⋯ ; en] = e1 :: e2 :: ⋯ :: en :: []

¤Ç¤¢¤ë¡¥

cons ¥ª¥Ú¥ì¡¼¥¿ :: ¤Ï¡¤¤¢¤¯¤Þ¤Ç¡Ö°ìÍ×ÁǤÎ(ÀèƬ¤Ø¤Î)ÄÉ²Ã¡× ¤ò¹Ô¤¦¤â¤Î¤Ç¡¤¥ê¥¹¥È¤Ë¥ê¥¹¥È¤òÄɲÃ(Ï¢·ë)¤¹¤ë¤È¤¤¤¦Áàºî¤ä¡¤¥ê¥¹¥È¤ÎºÇ¸å Èø¤ØÍ×ÁǤòÄɲ乤ë¤È¤¤¤Ã¤¿Áàºî¤Ï :: ¤Ç¹Ô¤¨¤Ê¤¤¡¥

# [1; 2] :: [3; 4];;
 [1; 2] :: [3; 4];;
^
This expression has type int but is here used with type int list
# [1; 2; 3] :: 4;;
 [1; 2; 3] :: 4;;
^
This expression has type int but is here used with type int list list

:: ¤Ïʸˡ¥­¡¼¥ï¡¼¥É¤Ê¤Î¤Ç¡¤:: ¤Î·¿¤ò¸«¤ë¤³¤È¤Ï¤Ç¤­¤Ê¤¤¤¬¡¤ ´º¤¨¤Æ·¿¤ò¹Í¤¨¤ë¤Ê¤é 'a -> 'a list -> 'a list ¤È»×¤¦¤Î¤¬¤è¤¤¤À¤í¤¦¡¥ ¥ê¥¹¥È¤Ï¤É¤ó¤ÊÃͤǤâÍ×ÁǤˤǤ­¡¤´Ø¿ô¤Î¥ê¥¹¥È¡¤¥ê¥¹¥È¤Î¥ê¥¹¥ÈÅù¤ò¹Í¤¨¤ë ¤³¤È¤â²Äǽ¤Ç¤¢¤ë¡¥

# [(fun x -> x + 1); (fun x -> x * 2)];;
- : (int -> int) list = [<fun>; <fun>]
# [1; 2; 3] :: [[4; 5]; []; [6; 7; 8]];;
- : int list list = [[1; 2; 3]; [4; 5]; []; [6; 7; 8]]

2ÈÖÌܤÎÎã¤Ï¡¤À°¿ô¥ê¥¹¥È¤Î¥ê¥¹¥È¤ËÀ°¿ô¥ê¥¹¥È¤ò :: ¤ÇÄɲ䷤Ƥ¤¤ë¡¥

5.2  ¥ê¥¹¥È¤ÎÍ×ÁǤؤΥ¢¥¯¥»¥¹: match¼°¤È¥ê¥¹¥È¥Ñ¥¿¡¼¥ó

¤µ¤Æ¡¤¥ê¥¹¥È¤ÎÍ×ÁǤ˥¢¥¯¥»¥¹¤¹¤ë¤È¤­¤Ë¤ÏÁȤÈƱÍͤ˥ѥ¿¡¼¥ó¤òÍѤ¤¤ë¡¥ ¥ê¥¹¥È¥Ñ¥¿¡¼¥ó¤Ï

[⟨ ¥Ñ¥¿¡¼¥ó1 ⟩; ⟨ ¥Ñ¥¿¡¼¥ó2 ⟩; ...; ⟨ ¥Ñ¥¿¡¼¥ón ⟩]

¤Ç n Í×ÁǤΥꥹ¥È(n ¤¬ 0 ¤Ê¤é¶õ¥ê¥¹¥È)¤Ë¥Þ¥Ã¥Á¤µ¤»¤ë¤³¤È¤¬¤Ç¤­ ¤ë¡¥¤Þ¤¿¡¤:: ¤ò»È¤Ã¤Æ¥Ñ¥¿¡¼¥ó¤òµ­½Ò¤¹¤ë¤³¤È¤â¤Ç¤­¤ë¡¥

⟨ ¥Ñ¥¿¡¼¥ó1 ⟩ :: ⟨ ¥Ñ¥¿¡¼¥ó2

¤È½ñ¤¤¤Æ¡¤ÀèƬ¤ÎÍ×ÁǤò ⟨ ¥Ñ¥¿¡¼¥ó1 ⟩ ¤Ë¡¤»Ä¤ê¤Î¥ê¥¹¥È¤ò ⟨ ¥Ñ¥¿¡¼¥ó2 ⟩¤Ë¥Þ¥Ã¥Á¤µ¤»¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥¼¡¤Î´Ø¿ô¤Ï¡¤ »°Í×ÁǤÎÀ°¿ô¥ê¥¹¥È¤ÎÍ×ÁǤÎϤò·×»»¤¹¤ë´Ø¿ô¤Ç¤¢¤ë¡¥

# (* equivalent to 
     let sum_list3 (x :: y :: z :: []) = x + y + z *)
  let sum_list3 ([x; y; z]) = x + y + z;;
Warning P: this pattern-matching is not exhaustive.
Here is an example of a value that is not matched:
[]
let sum_list3 ([x; y; z]) = x + y + z;;
^^^^^^^^^^^^^^^^^^^^^^^
val sum_list3 : int list -> int = <fun>

¥ê¥¹¥È¼°¤Î¾ì¹ç¤ÈƱÍÍ¡¤[x; y; z] ¤È¤¤¤¦¥Ñ¥¿¡¼¥ó¤Ï :: ¤È [] ¤ò »È¤Ã¤¿¥Ñ¥¿¡¼¥ó¤Çɽ¤¹¤³¤È¤¬¤Ç¤­¤ë¡¥¤³¤³¤Ç¡¤½ÅÍפʤ³¤È¤Ï¤³¤Î´Ø¿ô¤ò ¥³¥ó¥Ñ¥¤¥ë¤ò¤¹¤ë¤È¥³¥ó¥Ñ¥¤¥é¤«¤é·Ù¹ð¤¬È¯¤»¤é¤ì¤Æ¤¤¤ë¤³¤È¤Ç¤¢¤ë¡¥ ¤³¤Î “nonexhaustive pattern” ¤È¸Æ¤Ð¤ì¤ë·Ù¹ð¤Ï¡¤¡Ö¥Ñ¥¿¡¼¥ó¤Îɽ¤¹·¿¤Ë °¤¹¤ëÃͤǤ¢¤ê¤Ê¤¬¤é¡¤¥Ñ¥¿¡¼¥ó¤Ë¥Þ¥Ã¥Á¤·¤Ê¤¤Ãͤ¬Â¸ºß¤¹¤ë¡×¤È¤¤¤¦ °ÕÌ£¤Ç¤¢¤ê¡¤¥³¥ó¥Ñ¥¤¥é¤Ï¥Þ¥Ã¥Á¤·¤Ê¤¤ÃͤÎÎã¤ò¼¨¤·¤Æ¤¯¤ì¤ë¡¥ ¤¿¤·¤«¤Ë¤³¤ÎÎã¤Ç¤Ï°ú¿ô¤Î·¿¤Ï int list ¤Ç¤¢¤ë¤Ë¤â´Ø¤ï¤é¤º »°Í×ÁǤΥꥹ¥È¤Ë¤·¤«¥Þ¥Ã¥Á¤·¤Ê¤¤¡¥¼ÂºÝ¡¤¥Þ¥Ã¥Á¤·¤Ê¤¤Ãͤ˴ؿô¤òŬÍѤ¹¤ë¤È ¥Þ¥Ã¥Á¥ó¥°¤Ë¼ºÇÔ¤·¤¿¤È¤¤¤¦Îã³°¤¬È¯À¸¤¹¤ë¡¥

# sum_list3 [4; 5; 6];;
- : int = 15
# sum_list3 [2; 4];;
Exception: Match_failure ("", 27, 14).

¤Ç¤Ï¡¤Ç¤°Õ¤ÎŤµ¤ÎÀ°¿ô¥ê¥¹¥È¤ÎÍ×ÁǤÎϤò¼è¤ë´Ø¿ô¤ò½ñ¤¯¤Ë¤Ï¤É¤¦¤¹¤ì¤Ð ¤è¤¤¤Î¤À¤í¤¦¤«? Î㤨¡¤ÆóÍ×ÁǤΥꥹ¥È¤ÎϤò¼è¤ë´Ø¿ô¡¤»ÍÍ×Áǥꥹ¥È¤ÎϤò ¼è¤ë´Ø¿ô¤Ê¤É¤Ê¤É¤òÄêµÁ¤·¡¤¤½¤ì¤ò²¿¤é¤«¤Î¼êÃʤÇÁȤ߹ç¤ï¤»¤ë¤³¤È¤¬¤Ç¤­¤¿ ¤È¤·¤Æ¤â¡¤¤½¤ì¤Ç¤ÏÉÔ½½Ê¬¤Ç¤¢¤ë¡¥´Ø¿ôÄêµÁ¤ÎÂ礭¤µ¤¬Ìµ¸Â¤ËŤ¯¤Ê¤Ã¤Æ¤·¤Þ ¤¦! ¤³¤³¤Ç¡¤¥ê¥¹¥È¤¬ºÆµ¢Åª¤ÊÄêµÁ¤ò¤µ¤ì¤¿¹½Â¤¤Ç¤¢¤ë¤³¤È¤¬Èó¾ï¤Ë½ÅÍפʰÕÌ£¤ò»ý¤Ã ¤Æ¤¯¤ë¡¥¤Ä¤Þ¤ê¡¤¥ê¥¹¥È¤ÎºÆµ¢Åª¤ÊÄêµÁ¤«¤é¡¤Í×ÁǤÎϤò¼è¤ëÄêµÁ¤òƳ¤¯¤³¤È ¤¬¤Ç¤­¤ë¤Î¤Ç¤¢¤ë¡¥¤½¤ì¤¬°Ê²¼¤ÎÄêµÁ¤Ç¤¢¤ë¡¥

¥Ý¥¤¥ó¥È¤Ï¡¤Ä¹¤¤¥ê¥¹¥È¤ÎÁ´Í×ÁǤÎϤϤè¤êû¤¤¥ê¥¹¥È¤ÎÁ´Í×ÁǤÎÏ ¤«¤é·×»»¤Ç¤­¤ë¤³¤È¤Ç¤¢¤ë¡¥(fact ¤Ê¤É¤ÎÄêµÁ¤ÈÈæ¤Ù¤Æ¤ß¤è¡¥) ¤³¤ì¤ò Objective Caml ¤ÎÄêµÁ¤È¤¹¤ë¤¿¤á¤Ë¤Ï¡¤Í¿¤¨¤é¤ì¤¿¥ê¥¹¥È¤¬¶õ¤«¤½¤¦¤Ç¤Ê¤¤ ¤«¤òȽÃǤ¹¤ë¼êÃʤ¬É¬ÍפǤ¢¤ë¤¬¡¤¤Ò¤È¤Þ¤ºÎã¤ò¸«¤Æ¡¤¤½¤ÎȽÃǤò¤É¤Î¤è¤¦¤Ë¹Ô¤¦¤« ¸«¤Æ¤ß¤è¤¦¡¥

# let rec sum_list l =
    match l with 
      [] -> 0
    | n :: rest -> n + (sum_list rest);;
val sum_list : int list -> int = <fun>

¤Þ¤º¡¤sum_list ¤ÏºÆµ¢´Ø¿ô¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡¥ match °Ê²¼¤¬ l ¤¬¶õ¥ê¥¹¥È¤«¤½¤¦¤Ç¤Ê¤¤¤«¤òȽÃǤ·¡¤Ê¬´ô½èÍý¤ò¹Ô¤Ã¤Æ¤¤¤ëÉôʬ¤Ç match¼°¤È¸Æ¤Ð¤ì¤ë¡¥match¼°¤Î°ìÈÌŪ¤Êʸˡ¤Ï¡¤

match ⟨ ¼°0 ⟩ with ⟨ ¥Ñ¥¿¡¼¥ó1 ⟩ -> ⟨ ¼°1 ⟩ | … | ⟨ ¥Ñ¥¿¡¼¥ón ⟩ -> ⟨ ¼°n

¤È¤¤¤¦·Á¤ÇÍ¿¤¨¤é¤ì¡¤⟨ ¼°0 ⟩¤òɾ²Á¤·¤¿·ë²Ì¤ò¡¤⟨ ¥Ñ¥¿¡¼¥ó1 ⟩ ¤«¤é½çÈ֤˥ޥåÁ¤µ¤»¤Æ¤¤¤­¡¤⟨ ¥Ñ¥¿¡¼¥ói ⟩¤Ç¥Þ¥Ã¥Á¤¬À® ¸ù¤·¤¿¤é¡¤⟨ ¼°i ⟩¤òɾ²Á¤¹¤ë¡¥Á´ÂΤÎÃͤÏ⟨ ¼°i ⟩¤ÎÃͤǤ¢¤ë¡¥ ³Æ¥Ñ¥¿¡¼¥ó¤ÇƳÆþ¤µ¤ì¤¿ÊÑ¿ô (¾å¤ÎÎã¤Ç¤Ï n, rest) ¤ÏÂбþ¤¹¤ë¼°¤ÎÃæ¤À¤±¤ÇÍ­¸ú¤Ç ¤¢¤ë¡¥¾å¤Î Objective Caml ¤Ë¤è¤ëÄêµÁ¤¬¡¤¼«Á³¸À¸ì¤Ë¤è¤ëÄêµÁ¤ËÂбþ¤·¤Æ¤¤¤ë¤³¤È¤ò ³Î¤«¤á¤è¡¥Â¿¤¯¤Î¥ê¥¹¥È¤òÁàºî¤¹¤ë´Ø¿ô¤Ï sum_list ¤Î¤è¤¦¤Ë¡¤ ¶õ¥ê¥¹¥È¤Î¾ì¹ç¤Î½èÍý¤È¡¤cons ¤Î¾ì¹ç¤Î½èÍý¤ò match ¤ÇÁȤ߹ç¤ï¤»¤Æ ½ñ¤«¤ì¤ë¡¥

match¼°¤Ë¤Ä¤¤¤Æ¤ÎÃí°Õ

match ¼°¤¬¥Þ¥Ã¥Á¥ó¥°¤ò½çÈ֤˹Ԥ¦¡¤¤È¤¤¤¦¤Î¤ÏÈó¾ï¤Ë½ÅÍ×¤Ê ÅÀ¤Ç¤¢¤ë¡¥¤â¤·¤â¡¤Æ±¤¸Ãͤ¬Ê£¿ô¤Î¥Ñ¥¿¡¼¥ó¤Ë¥Þ¥Ã¥Á¤¹¤ë¾ì¹ç¤ÏÀè¤Ë ½ñ¤¤¤Æ¤¢¤ë¥Ñ¥¿¡¼¥ó¤Ë¥Þ¥Ã¥Á¤·¤Æ¤·¤Þ¤¦¡¥¤³¤Î¤è¤¦¤ÊÎã¤ÏÆäËÄê¿ô¥Ñ ¥¿¡¼¥ó¤ò»ÈÍѤ¹¤ë¤ÈȯÀ¸¤·¤ä¤¹¤¤¡¥Äê¿ô¥Ñ¥¿¡¼¥ó¤ÏÀ°¿ô¡¤Ê¸»úÎóÄê¿ô¤ò ¥Ñ¥¿¡¼¥ó¤È¤·¤ÆÍѤ¤¤ë¤â¤Î¤Ç¡¤¤½¤ÎÄê¿ô¤Ë¤Î¤ß¥Þ¥Ã¥Á¤¹¤ë¡¥¤Þ¤¿¡¤ Á°¤Ë½ñ¤¤¤Æ¤¢¤ë¥Ñ¥¿¡¼¥ó¤Î¤»¤¤¤Ç¡¤¥Ñ¥¿¡¼¥ó¤Ë¥Þ¥Ã¥Á¤¹¤ëÃͤ¬¤Ê¤¤¾ì¹ç¡¤ ¥³¥ó¥Ñ¥¤¥é¤Ï “this match case is unused.” ¤È·Ù¹ð¤òȯ¤¹¤ë¡¥

# let f x = 
    match x with (1, _) -> 2 | (_, 1) -> 3 | (1, 1) -> 0 | _ -> 1;;
Warning U: this match case is unused.
match x with (1, _) -> 2 | (_, 1) -> 3 | (1, 1) -> 0 | _ -> 1;;
^^^^^^
val f : int * int -> int = <fun>
# f (1, 1);;
- : int = 2

(1, 1) ¤ÏºÇ½é¤Î¥Ñ¥¿¡¼¥ó¤Ë¥Þ¥Ã¥Á¤¹¤ë¡¥¤Þ¤¿¡¤3ÈÖÌܤΥѥ¿¡¼¥ó¤Ï ·è¤·¤Æ»È¤ï¤ì¤Ê¤¤¤Î¤Ç·Ù¹ð¤¬½Ð¤Æ¤¤¤ë¡¥

¤µ¤Æ¡¤°ìÈÌŪ¤Ê¥ê¥¹¥ÈÁàºî´Ø¿ô¤ÎÎã¤ò¸«¤Æ¤¤¤¯Á°¤Ë¡¤¤â¤¦¤Ò¤È¤ÄÎã¤ò¤ß¤Æ¤¤¤³ ¤¦¡¥(¶õ¤Ç¤Ê¤¤)À°¿ô¥ê¥¹¥È¤Î¤Ê¤«¤«¤éºÇÂçÃͤòÊÖ¤¹´Ø¿ô max_list ¤Ï

# let rec max_list l =
    match l with
      [x] -> x
    | n1 :: n2 :: rest -> 
       if n1 > n2 then max_list (n1 :: rest) else max_list (n2 :: rest);;
Warning P: this pattern-matching is not exhaustive.
Here is an example of a value that is not matched:
[]
..match l with
[x] -> x
| n1 :: n2 :: rest -> 
if n1 > n2 then max_list (n1 :: rest) else max_list (n2 :: rest)..
val max_list : 'a list -> 'a = <fun>

¤Î¤è¤¦¤ËÄêµÁ¤µ¤ì¤ë¡¥

5.3  ¥ê¥¹¥ÈÁàºî¤Î´Ø¿ô

¤µ¤Æ¡¤¥ê¥¹¥È¤ËÂФ¹¤ë´ðËÜŪ¤ÊÁàºî(¹½À®¤ÈÍ×ÁÇ¥¢¥¯¥»¥¹)¤ò¤ß¤¿¤È¤³¤í¤Ç¡¤ ÍÍ¡¹¤Ê¥ê¥¹¥ÈÁàºî¤ò¹Ô¤¦´Ø¿ô¤ò¸«¤Æ¤¤¤³¤¦¡¥Â¿¤¯¤Î´Ø¿ô¤¬¥ê¥¹¥È¤Î¹½Â¤¤Ë´Ø¤· ¤ÆºÆµ¢Åª¤ËÄêµÁ¤µ¤ì¤ë¡¥¤Þ¤¿¡¤¤Û¤È¤ó¤É¤¹¤Ù¤Æ¤Î´Ø¿ô¤¬Í×ÁÇ·¿¤Ë¤è¤é¤Ê¤¤ÄêµÁ ¤ò¤·¤Æ¤¤¤ë¤¿¤á¡¤Â¿Áê·¿¤¬Í¿¤¨¤é¤ì¤ë¤³¤È¤ËÃí°Õ¤·¤è¤¦¡¥

hd, tl, null

¥ê¥¹¥È¤ÎÀèƬÍ×ÁÇ¡¤¥ê¥¹¥È¤ÎÀèƬ¤ò½ü¤¤¤¿»Ä¤ê¤òÊÖ¤¹´Ø¿ô hd (head ¤Îά), tl (tail ¤Îά) ¤Ï°Ê²¼¤Î¤è¤¦¤ËÄêµÁ¤µ¤ì¡¤

# let hd (x::rest) = x
  let tl (x::rest) = rest;;
Warning P: this pattern-matching is not exhaustive.
Here is an example of a value that is not matched:
[]
Characters 29-45:
Warning P: this pattern-matching is not exhaustive.
Here is an example of a value that is not matched:
[]
let hd (x::rest) = x
^^^^^^^^^^^^^
let tl (x::rest) = rest;;
^^^^^^^^^^^^^^^^
val hd : 'a list -> 'a = <fun>
val tl : 'a list -> 'a list = <fun>

¶õ¥ê¥¹¥È¤ËÂФ·¤Æ¤ÏƯ¤±¤Ê¤¤ nonexhaustive ¤Ê´Ø¿ô¤Ç¤¢¤ë¡¥null ¤Ï Í¿¤¨¤é¤ì¤¿¥ê¥¹¥È¤¬¶õ¤«¤É¤¦¤«¤òȽÄꤹ¤ë´Ø¿ô¤Ç¤¢¤ë¡¥

# let null = function [] -> true | _ -> false;;
val null : 'a list -> bool = <fun>

function ¥­¡¼¥ï¡¼¥É¤Ï fun ¤È match ¤òÁȤ߹ç¤ï¤»¤Æƿ̾´Ø¿ô¤òÄê µÁ¤¹¤ë¤â¤Î¤Ç¡¤

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

¤Ç

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

¤ò¼¨¤¹¡¥ºÇ¸å¤Ë¼õ¤±¼è¤Ã¤¿°ú¿ô¤Ë´Ø¤·¤Æ¨ºÂ¤Ë¥Ñ¥¿¡¼¥ó¥Þ¥Ã¥Á¤ò¹Ô¤¦¤è¤¦¤Ê ´Ø¿ôÄêµÁ¤ÎºÝ¤ËÊØÍø¤Ç¤¢¤ë¡¥

nth, take, drop

¼¡¤Ï¡¤nÈÖÌܤÎÍ×ÁǤò¼è¤ê½Ð¤¹ nth, nÈÖÌܤޤǤÎÍ×ÁǤΠÉôʬ¥ê¥¹¥È¤ò¼è¤ê½Ð¤¹ take¡¤nÈÖÌܤޤǤÎÍ×ÁǤòÈ´¤«¤·¤¿ Éôʬ¥ê¥¹¥È¤ò¼è¤ê½Ð¤¹ drop ¤Ç¤¢¤ë¡¥¥ê¥¹¥È¤ÎÍ×ÁǤÏÀèƬ¤ò°ìÈÖÌܤȤ¹¤ë¡¥

# let rec nth n l = 
    if n = 1 then hd l else nth (n - 1) (tl l)
  let rec take n l =
    if n = 0 then [] else (hd l) :: (take (n - 1) (tl l))
  let rec drop n l =
    if n = 0 then l else drop (n - 1) (tl l);;
val nth : int -> 'a list -> 'a = <fun>
val take : int -> 'a list -> 'a list = <fun>
val drop : int -> 'a list -> 'a list = <fun>

¤³¤ì¤é¤Î´Ø¿ô¤Ï¥ê¥¹¥È¤Î¹½Â¤¤Ç¤Ê¤¯¡¤n¤Ë´Ø¤·¤Æ¤ÎºÆµ¢´Ø¿ô¤Ë ¤Ê¤Ã¤Æ¤¤¤ë¡¥

# let ten_to_zero = [10; 9; 8; 7; 6; 5; 4; 3; 2; 1; 0];;
val ten_to_zero : int list = [10; 9; 8; 7; 6; 5; 4; 3; 2; 1; 0]
# nth 4 ten_to_zero;;
- : int = 7
# take 8 ten_to_zero;;
- : int list = [10; 9; 8; 7; 6; 5; 4; 3]
# drop 7 ten_to_zero;;
- : int list = [3; 2; 1; 0]
# take 19 ten_to_zero;;
Exception: Match_failure ("", 48, 7).
length

¼¡¤Ï¥ê¥¹¥È¤ÎŤµ¤òÊÖ¤¹´Ø¿ô length ¤Ç¤¢¤ë¡¥

# let rec length = function
      [] -> 0
    | _ :: rest -> 1 + length rest;;
val length : 'a list -> int = <fun>

length ¤Î·¿¤Ï _ ¥Ñ¥¿¡¼¥ó¤ò»È¤Ã¤ÆÀèƬÍ×ÁǤò»ÈÍѤ·¤Æ¤Ê¤¤¤³¤È¤«¤é¤ï¤« ¤ë¤è¤¦¤Ë¡¤¤É¤ó¤Ê¥ê¥¹¥È¤ËÂФ·¤Æ¤â»È¤¦¤³¤È¤¬¤Ç¤­¤ë¡¥¼ÂºÝ¡¤·¿¤ò¤ß¤ë¤È ÆþÎϤÎÍ×ÁÇ·¿¤¬·¿ÊÑ¿ô¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡¥

# length [1; 2; 3];;
- : int = 3
# length [[true; false]; [false; false; false;]];;
- : int = 2

¤Þ¤¿ length ¤Ï¤Õ¤¿¤Ä¤á¤Î·ë²Ì¤Ë¤ß¤é¤ì¤ë¤è¤¦¤Ë¡¤°ìÈÖ³°Â¦¤Î¥ê¥¹¥È ¤ÎŤµ¤ò·×»»¤¹¤ë¤â¤Î¤Ç¤¢¤ë(·ë²Ì¤Ï 5 ¤Ç¤Ï¤Ê¤¤)¡¥

append, reverse

¼¡¤Ë¼¨¤¹ append ´Ø¿ô¤Ï¥ê¥¹¥ÈƱ»Î¤òÏ¢·ë¤¹¤ë´Ø¿ô¤Ç¤¢¤ë¡¥append l1 l2 ¤Î ºÆµ¢ÅªÄêµÁ¤Ï

¤È¹Í¤¨¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥

# let rec append l1 l2 =
    match l1 with
      [] -> l2
    | x :: rest -> x :: (append rest l2);;
val append : 'a list -> 'a list -> 'a list = <fun>
# append [1; 2; 3] [4; 5; 6];;
- : int list = [1; 2; 3; 4; 5; 6]

¤³¤Î append ¤ÎÄêµÁ¤Ï¡¤l1 ¤ÎŤµ¤¬Ä¹¤¯¤Ê¤ë¤Û¤É ºÆµ¢¸Æ¤Ó½Ð¤·¤¬¿¼¤¯¹Ô¤ï¤ì¡¤l2 ¤ÎŤµ¤Ë¤Ï´Ø·¸¤¬¤Ê¤¤¡¥ ¤Á¤Ê¤ß¤Ë append ´Ø¿ô¤Ï¡¤¤â¤È¤â¤È Objective Caml µ¯Æ°»þ¤ËÃæÃÖ¥ª¥Ú¥ì¡¼¥¿ @ ¤È¤·¤Æ ÄêµÁ¤µ¤ì¤Æ¤¤¤ë¡¥

# [1; 2; 3] @ [4; 5; 6];;
- : int list = [1; 2; 3; 4; 5; 6]

¤Þ¤¿ append ¤ò»È¤Ã¤Æ¥ê¥¹¥È¤òȿž¤µ¤»¤ë reverse ´Ø¿ô¤òÄêµÁ¤Ç¤­¤ë¡¥

# let rec reverse = function
      [] -> []
    | x :: rest -> append (reverse rest) [x];;
val reverse : 'a list -> 'a list = <fun>

¥ê¥¹¥È¤ÎºÇ¸å¤ËÍ×ÁǤòÄɲ乤뤳¤È¤ÏľÀܤϤǤ­¤Ê¤¤¤Î¤Ç¡¤°ìÍ×Áǥꥹ¥È¤òºî¤Ã ¤Æ append ¤·¤Æ¤¤¤ë¡¥¤·¤«¤·¡¤¤³¤Î´Ø¿ô¤Ï¤¢¤Þ¤ê¸úΨŪ¤Ç¤Ï¤Ê¤¤¡¥¤Ê¤¼¤Ê¤é¡¤ reverse ¤Î¸Æ¤Ó½Ð¤·°ìÅ٤ˤĤ­¡¤append ¤¬°ìÅٸƤФì¤ë¤¬¡¤¤³¤Î»þ append ¤ÎÂè°ì°ú¿ô¤ÎŤµ¤Ï¡Öȿž¤µ¤»¤è¤¦¤È¤¹¤ë°ú¿ô¤ÎŤµ−1¡×¤Ç¤¢ ¤êappend ¤ò·×»»¤¹¤ë¤Î¤Ë¤½¤ÎŤµÊ¬¤Î·×»»Î̤òɬÍפȤ¹¤ë¡¥reverse ¤Î ºÆµ¢¸Æ¤Ó½Ð¤·²ó¿ô¤ÏÍ¿¤¨¤¿¥ê¥¹¥È¤ÎŤµ¤Ê¤Î¤Ç¡¤¥ê¥¹¥È¤ÎŤµ¤Î¼«¾è¤ËÈæÎ㤷 ¤¿·×»»»þ´Ö¤¬¤«¤«¤Ã¤Æ¤·¤Þ¤¦¡¥

¤³¤ì¤ò²þÁ±¤·¤¿¤Î¤¬¼¡¤ÎÄêµÁ¤Ç¤¢¤ë¡¥

# let rec revAppend l1 l2 = 
    match l1 with
      [] -> l2
    | x :: rest -> revAppend rest (x :: l2)
  let rev x = revAppend x [];;
val revAppend : 'a list -> 'a list -> 'a list = <fun>
val rev : 'a list -> 'a list = <fun>

ºÇ½é¤ÎºÆµ¢´Ø¿ô revAppend ¤¬Âè°ì°ú¿ô¤òÀèƬ¤«¤é½ç¤Ë l2 ¤ËÄɲ䷤ƹԤ¯ ´Ø¿ô¤Ç¤¢¤ë¡¥ÀèƬ¤«¤éÄɲ䷤Ƥ¤¤¯¤¿¤á¡¤l1 ¤Î½ç¤¬µÕ¤Ë¤Ê¤Ã¤Æ l2 ¤ËÏ¢·ë¤µ¤ì¤ë¡¥

# revAppend [1; 2; 3] [4; 5; 6];;
- : int list = [3; 2; 1; 4; 5; 6]

¤³¤Î´Ø¿ô¤â append ¤ÈƱ¤¸¤¯¡¤Âè°ì°ú¿ô¤ÎŤµ¤À¤±¤ËÈæÎ㤷¤¿»þ´Ö¤¬¤«¤«¤ë¡¥ ¥ê¥¹¥È¤Îȿž¤Ï revAppend ¤ÎÂèÆó°ú¿ô¤¬¶õ¤Ç¤¢¤ëÆÃÊ̤ʾì¹ç¤Ç¤¢¤ë¡¥

# rev ['a'; 'b'; 'c'; 'd'];;
- : char list = ['d'; 'c'; 'b'; 'a']
map

map ¤Ï¥ê¥¹¥È¤Î³ÆÍ×ÁǤËÂФ·¤ÆƱ¤¸´Ø¿ô¤òŬÍѤ·¤¿·ë²Ì¤Î¥ê¥¹¥È¤òµá¤á¤ë ¤¿¤á¤Î¹â³¬´Ø¿ô¤Ç¤¢¤ë¡¥

# let rec map f = function
      [] -> []
    | x :: rest -> f x :: map f rest;;
val map : ('a -> 'b) -> 'a list -> 'b list = <fun>

¤¿¤È¤¨¤Ð¡¤À°¿ô¥ê¥¹¥È¤Î³ÆÍ×ÁǤò2Çܤ¹¤ë¼°¤Ï map ¤ò»È¤Ã¤Æ¡¤

# map (fun x -> x * 2) [4; 91; 0; -34];;
- : int list = [8; 182; 0; -68]

¤È½ñ¤¯¤³¤È¤¬¤Ç¤­¤ë¡¥map ¤Î·¿¤Ïº£¤Þ¤Ç¸«¤¿Ãæ¤Ç¤«¤Ê¤êÊ£»¨¤Ç¤¢¤ë¡¥ ¤Þ¤º¡¤'a -> 'b ¤Ç¡Ö²¿¤é¤«¤Î´Ø¿ô¡×¤¬Âè°ì°ú¿ô¤Ç¤¢¤ë¤³¤È¤¬¤ï¤«¤ë¡¥ ¥«¥ê¡¼²½´Ø¿ô¤È¤ß¤ë¤Ê¤é¤Ð¡¤ÂèÆó°ú¿ô¤Ï¡Ö²¿¤é¤«¤Î´Ø¿ô¡×¤ÎÄêµÁ°è ¤ÎÃͤòÍ×ÁǤȤ¹¤ë¥ê¥¹¥È¤Ç¡¤·ë²Ì¤¬¡Ö²¿¤é¤«¤Î´Ø¿ô¡×¤ÎÃÍ°è¤ÎÃͤò Í×ÁǤȤ¹¤ë¥ê¥¹¥È¤È¤Ê¤ë¡¥¤Þ¤¿¤Ï¡Ö²¿¤é¤«¤Î´Ø¿ô¡×¤òÍ¿¤¨¤¿»þÅÀ¤Ç ¥ê¥¹¥È¤«¤é¥ê¥¹¥È¤Ø¤Î´Ø¿ô¤¬Ê֤äƤ­¤Æ¤¤¤ë¤È²ò¼á¤·¤Æ¤â¤è¤¤¡¥

forall, exists

forall ¤Ï¥ê¥¹¥È¤ÎÍ×ÁǤ˴ؤ¹¤ë½Ò¸ì(Í×ÁǤ«¤é bool ¤Ø¤Î´Ø¿ô)¤È¡¤¥ê¥¹ ¥È¤ò¤È¤ê¡¤Á´Í×ÁǤ¬½Ò¸ì¤òËþ¤¿¤¹¤«¤É¤¦¤«¤ò¡¤exists ¤ÏƱÍͤ˽Ҹì¤È ¥ê¥¹¥È¤ò¤È¤Ã¤Æ¡¤½Ò¸ì¤òËþ¤¿¤¹Í×ÁǤ¬¤¢¤ë¤«¤É¤¦¤«¤òÊÖ¤¹´Ø¿ô¤Ç¤¢¤ë¡¥

# let rec forall p = function 
      [] -> true
    | x :: rest -> if p x then forall p rest else false
  let rec exists p = function
      [] -> false
    | x :: rest -> (p x) or (exists p rest);;
val forall : ('a -> bool) -> 'a list -> bool = <fun>
val exists : ('a -> bool) -> 'a list -> bool = <fun>
# forall (fun c -> 'z' > c) ['A'; ' '; '+'];;
- : bool = true
# exists (fun x -> (x mod 7) = 0) [23; -98; 19; 53];;
- : bool = true
¾ö¤ß¹þ¤ß´Ø¿ô fold

¾å¤Ç¸«¤¿ sum_list, append ¤Ï¥ê¥¹¥È¤ÎÍ×ÁǤ¹¤Ù¤Æ¤òÍѤ¤¤¿±é»»¤ò¤¹¤ë¤â ¤Î¤Ç¤¢¤ë¡¥¼Â¤Ï¤³¤ÎÆó¤Ä¤Î´Ø¿ô¤Ï¶¦Ä̤η׻»¤Î¹½Â¤¤ò»ý¤Ã¤Æ¤¤¤ë¡¥ sum_list ¤Ï [i1; i2; ...; in], ¤Ä¤Þ¤ê

i1 :: i2 :: ... :: in :: []

¤«¤é

i1 + (i2 + (... + (in + 0)...))

¤ò·×»»¤·¡¤ append [e1; e2; ...; en] l2 ¤Ï

e1 :: (e2 :: ... :: (en :: l2)...)

¤ò·×»»¤·¤Æ¤¤¤ë¡¥ ¤³¤Î¤Õ¤¿¤Ä¤Î·×»»¤Î¶¦ÄÌÅÀ¤Ï¡¤

¤³¤È¤Ç¤¢¤ë¡¥¤³¤Î¤è¤¦¤Ê¡Ö±¦¤«¤é¾ö¤ß¹þ¤à¡×·×»»¹½Â¤¤ò°ìÈ̲½¤·¤¿¹â³¬´Ø¿ô¤ò fold_right ¤È¸Æ¤Ö¡¥µÕ¤Ëº¸¤«¤é¾ö¤ß¹þ¤à¤Î¤ò fold_left ¤È¸Æ¤Ö¡¥ rev ¤Ï fold_left ¤ÎÎã¤Ç¤¢¤ë¡¥²¿¸Î¤Ê¤é¡¤ rev [e1; e2; ...; en] ¤Ï l ::: x ¤ò x :: l ¤È¤·¤Æ¡¤

(...(([] ::: e1) ::: e2) ... ::: en)

¤Èɽ¸½¤Ç¤­¤ë¤«¤é¤Ç¤¢¤ë¡¥

°Ê²¼¤¬ fold_right, fold_left ¤ÎÄêµÁ¤Ç¤¢¤ë¡¥

fold_right f [e1; e2; ...; en] e =⇒ f e1 (f e2 (... (f en e)...))

fold_left f e [e1; e2; ...; en] =⇒ f (... (f (f e e1) e2) ...) en

¤ò·×»»¤¹¤ë¡¥

# let rec fold_right f l e =
    match l with
      [] -> e
    | x :: rest -> f x (fold_right f rest e)
  let rec fold_left f e l =
    match l with
      [] -> e
    | x :: rest -> fold_left f (f e x) rest;;
val fold_right : ('a -> 'b -> 'b) -> 'a list -> 'b -> 'b = <fun>
val fold_left : ('a -> 'b -> 'a) -> 'a -> 'b list -> 'a = <fun>
# fold_right (fun x y -> x + y) [3; 5; 7] 0;;
- : int = 15
# fold_left (fun x y -> y :: x) [] [1; 2; 3];;
- : int list = [3; 2; 1]

fold_left, fold_right ¤ÏÍ×ÁǤϤ½¤Î¤Þ¤Þ¤Ç cons ¤òŬÅö¤Ê±é»»»Ò¤Ë ÆɤßÂؤ¨¤Æ¡¤·×»»¤ò¤¹¤ë¤â¤Î¤È»×¤¦¤³¤È¤¬¤Ç¤­¤ë¡¥°ìÊý¡¤ map ´Ø¿ô¤Ï¥ê¥¹¥È¤Î¹½Â¤¤Ï¤½¤Î¤Þ¤Þ¤Ç¡¤Í×ÁǤÀ¤±¤òÁàºî¤¹¤ë ¤è¤¦¤Ê·×»»¹½Â¤¤òÃê¾Ý²½¤·¤¿¹â³¬´Ø¿ô¤Ç¤¢¤Ã¤¿¡¥¼Â¤Ï¥ê¥¹¥È¤Ë´Ø¤¹¤ë ºÆµ¢´Ø¿ô¤Ï¤Û¤È¤ó¤É map ¤È fold_left ¤Þ¤¿¤Ï fold_right ¤òÁȤ߹ç¤ï¤»¤Æ ÄêµÁ¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥Î㤨¤Ð¡¤length ¤ÏÁ´Í×ÁǤò¤Þ¤º map ¤ò»È¤Ã¤Æ 1 ¤ËÃÖ´¹¤¨¤Æ¡¤Â­¤·»»¤Ë¤è¤ë¾ö¤ß¹þ¤ß¤ò¹Ô¤¨¤Ð¤è¤¤¤Î¤Ç¡¤

# let length l = fold_right (fun x y -> x + y) (map (fun x -> 1) l) 0;;
val length : 'a list -> int = <fun>

¤ÈÄêµÁ¤¹¤ë¤³¤È¤â²Äǽ¤Ç¤¢¤ë¡¥

Ï¢Áۥꥹ¥È

¼­½ñ¤Ë¤ª¤±¤ë¸«½Ð¤·¤ÈÀâÌÀʸ¡¤¥Ç¡¼¥¿¥Ù¡¼¥¹¤Ë¤ª¤±¤ë¥Ç¡¼¥¿¸¡º÷¤Î¤¿¤á¤Î¥­¡¼ ¤È¥Ç¡¼¥¿¡¤¤Î¤è¤¦¤Ê¡Ö´Ø·¸¡×¤òɽ¸½¤¹¤ë¤Î¤ËÏ¢Áۥꥹ¥È(association list) ¤È¤¤¤¦¥Ç¡¼¥¿¹½Â¤¤òÍѤ¤¤ë¡¥Ï¢Áۥꥹ¥È¤Ï¹½Â¤Åª¤Ë¤Ï¥Ú¥¢¤Î¥ê¥¹¥È¤Çɽ¸½¤µ¤ì¤ë¡¥ ³ÆÍ×ÁÇ (a, b) ¤Ï¥­¡¼ a ¤Î ¥Ç¡¼¥¿ b ¤Ø¤Î´ØÏ¢ÉÕ¤±¤òɽ¸½¤¹¤ë¡¥

Î㤨¤Ð¡¤°Ê²¼¤Ï¡¤ÅÔ»Ô¤Î̾Á°¤ò¥­¡¼¡¤»Ô³°¶ÉÈÖ¤ò¥Ç¡¼¥¿¤È¤·¤¿ Ï¢Áۥꥹ¥È¤ÎÎã¤Ç¤¢¤ë¡¥

# let city_phone = [("Kyoto", "075"); ("Osaka", "06"); ("Tokyo", "03")];;
val city_phone : (string * string) list =
[("Kyoto", "075"); ("Osaka", "06"); ("Tokyo", "03")]

¤³¤Î¤è¤¦¤ÊÏ¢Áۥꥹ¥È¤È¥­¡¼¤«¤é¡¤´ØÏ¢¤Å¤±¤é¤ì¤¿¥Ç¡¼¥¿¤ò¼è¤ê½Ð¤¹ ´Ø¿ô assoc ¤Ï°Ê²¼¤Î¤è¤¦¤ËÄêµÁ¤Ç¤­¤ë¡¥

# let rec assoc a = function
     (a', b) :: rest -> if a = a' then b else assoc a rest;;
Warning P: this pattern-matching is not exhaustive.
Here is an example of a value that is not matched:
[]
..................function
(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: Match_failure ("", 124, 18).

Ï¢Áۥꥹ¥È¤Ë¤Ê¤¤¥­¡¼¤ÇÌ䤤¹ç¤ï¤»¤ò¹Ô¤¦¤È¡¤ºÆµ¢¸Æ¤Ó½Ð¤·¤¬¥ê¥¹¥È¤ÎËöü¤Þ¤Ç Åþ㤷¤¿Ëö¤Ë¥Þ¥Ã¥Á¥ó¥°¤Ë¼ºÇÔ¤·¤ÆÎã³°¤òȯÀ¸¤¹¤ë¡¥

5.4  Case Study: ¥½¡¼¥È¥¢¥ë¥´¥ê¥º¥à

¥ê¥¹¥È¤ò»È¤Ã¤¿¥½¡¼¥È¥¢¥ë¥´¥ê¥º¥à¤ò¤¤¤¯¤Ä¤«¤ß¤Æ¤¤¤³¤¦¡¥°Ê²¼¤Ç¤Ï ¥ê¥¹¥È¤ò < ¤Ë´Ø¤¹¤ë¾º½ç(¾®¤µ¤¤Êý¤«¤é½ç)¤ËʤÙÂؤ¨¤ë¤³¤È¤ò¹Í¤¨¤ë¡¥ (Èæ³Ó±é»»»Ò < ¤Ï¿ÁêŪ¤Ç¤¢¤ë¤¿¤á¡¤¥½¡¼¥È´Ø¿ô¤â¿ÁêŪ¤Ë»È¤¨¤ë¡¥)

¤Þ¤º¤Ï½àÈ÷¤È¤·¤Æ¡¤¥½¡¼¥È¤ÎÂоݤȤ·¤ÆÍѤ¤¤ë¡¤µ¿»÷Íð¿ôÎó¤òÀ¸À®¤¹¤ë¤¿¤á ¤Î´Ø¿ô¤òÄêµÁ¤¹¤ë¡¥

# let nextrand seed =
    let a = 16807.0 and m = 2147483647.0 in
    let t = a *. seed
    in t -. m *. floor (t /. m)
  let rec randlist n seed tail =
    if n = 0 then (seed, tail)
    else randlist (n - 1) (nextrand seed) (seed::tail);;
val nextrand : float -> float = <fun>
val randlist : int -> float -> float list -> float * float list = <fun>
# randlist 10 1.0 [];;
- : float * float list =
(2007237709.,
[1458777923.; 1457850878.; 101027544.; 470211272.; 1144108930.; 984943658.;
1622650073.; 282475249.; 16807.; 1.])

ÁÞÆþ¥½¡¼¥È(insertion sort)¤Ï¡¤´û¤Ë¥½¡¼¥ÈºÑ¤Î¥ê¥¹¥È¤Ë ¿·¤·¤¤Í×ÁǤò¤Ò¤È¤ÄÉÕ¤±²Ã¤¨¤ëÁàºî¤ò´ðËܤȤ·¤Æ¡¤³ÆÍ×ÁǤò ½ç¤ËÉÕ¤±²Ã¤¨¤Æ¤¤¤¯¤â¤Î¤Ç¤¢¤ë¡¥´ðËÜÁàºî insert ¤Ï

# let rec insert (x : float) = function 
      (* Assume the second argument is already sorted *)
      [] -> [x]
    | (y :: rest) as l -> if x < y then x :: l else y :: (insert x rest);;
val insert : float -> float list -> float list = <fun>
# insert 4.5 [2.2; 9.1];;
- : float list = [2.2; 4.5; 9.1]

¤È½ñ¤¯¤³¤È¤¬¤Ç¤­¤ë¡¥¥Ñ¥¿¡¼¥óÃæ¤Ë½Ð¸½¤¹¤ë

⟨ ¥Ñ¥¿¡¼¥ó ⟩ as ⟨ ÊÑ¿ô ⟩

¤Ï as ¥Ñ¥¿¡¼¥ó¤È¸Æ¤Ð¤ì¤ë¤â¤Î¤Ç¡¤¥Ñ¥¿¡¼¥ó¤Ë¥Þ¥Ã¥Á¤·¤¿ÃÍÁ´ÂΤò ⟨ ÊÑ¿ô ⟩¤Ç»²¾È¤Ç¤­¤ë¤â¤Î¤Ç¤¢¤ë¡¥¤³¤³¤Ç¤Ï x :: y :: rest ¤È ½ñ¤¯Âå¤ê¤Ë x :: l ¤È¤·¤Æ¤¤¤ë¡¥¤³¤Î insert ¤ò»È¤Ã¤Æ¥½¡¼¥È¤ò ¹Ô¤¦´Ø¿ô¤Ï

# let rec insertion_sort = function
      [] -> []
    | x :: rest -> insert x (insertion_sort rest);;
val insertion_sort : float list -> float list = <fun>

¤ÈÄêµÁ¤Ç¤­¤ë¡¥

ÁÞÆþ¥½¡¼¥È¤Ï insert, insertion_sort ¤È¤â¤ËÆþÎϤËÈæÎ㤹¤ë²ó¿ô¤ÎºÆµ¢¸Æ½Ð ¤·¤ò¹Ô¤¦¤¿¤á¡¤·×»»¤Ë¤ÏÍ¿¤¨¤é¤ì¤¿¥ê¥¹¥È¤ÎŤµ¤Î¼«¾è¤ËÈæÎ㤷¤¿»þ´Ö¤¬¤«¤«¤ë¡¥ ¥¯¥¤¥Ã¥¯¥½¡¼¥È(quick sort)¤ÏC.A.R. Hoare¤¬È¯ÌÀ¤·¤¿¸úΨ¤ÎÎɤ¤¥½¡¼ ¥È¥¢¥ë¥´¥ê¥º¥à¤Ç¡¤Ê¬³äÅý¼£(divide and conquer)Ë¡¤Ë´ð¤Å¤­¡¤²¼¤Î¤è ¤¦¤ÊÍ×ÎΤǥ½¡¼¥È¤ò¹Ô¤¦¡¥

# let rec quick = function
      [] -> []
    | [x] -> [x]
    | x :: xs ->  (* x is the pivot *)
        let rec partition left right = function
            [] -> (quick left) @ (x :: quick right)
          | y :: ys -> if x < y then partition left (y :: right) ys
                       else partition (y :: left) right ys
        in partition [] [] xs;;
val quick : 'a list -> 'a list = <fun>

¤³¤Î quick ¤ÎÄêµÁ¤Ï append ¤ò»ÈÍѤ·¤Æ¤¤¤ë¤Î¤Ç¤Þ¤À¸úΨ¤Î°­¤¤ÅÀ¤¬ »Ä¤Ã¤Æ¤¤¤ë¡¥(append ¤ò»ÈÍѤ·¤Ê¤¤ÄêµÁ¤ÏÎý½¬ÌäÂê¡¥) ¥¯¥¤¥Ã¥¯¥½¡¼¥È¤Ï ¥ê¥¹¥È¤ÎŤµ¤ò n ¤È¤·¤Æ¡¤Ê¿¶Ñ¤Ç nlogn ¤ËÈæÎ㤷¤¿»þ´Ö¤Ç ¹Ô¤¨¤ë¤³¤È¤¬ÃΤé¤ì¤Æ¤¤¤ë¡¥

insert_sort (snd (randlist 10000 1.0 []))

¤È

quick (snd (randlist 10000 1.0 []))

¤ò»î¤·¤Æ¤ß¤è¡¥(snd ¤Ï¥Ú¥¢¤«¤éÂèÆóÍ×ÁǤò¼è¤ê½Ð¤¹ÄêµÁºÑ¤Î´Ø¿ô¤Ç¤¢¤ë¡¥)

5.5  Îý½¬ÌäÂê

Exercise 1  ¼¡¤Î¤¦¤Á¡¤Àµ¤·¤¤¥ê¥¹¥Èɽ¸½¤Ï¤É¤ì¤«¡¥¥³¥ó¥Ñ¥¤¥é¤ËÆþÎϤ¹¤ëÁ°¤Ë¡¤ Àµ¤·¤¤¾ì¹ç¤È»×¤¦¾ì¹ç¤Ï¼°¤Î·¿¤ò¡¤´Ö°ã¤Ã¤Æ¤¤¤ë¤È»×¤¦¾ì¹ç¤Ï¤Ê¤¼¸í¤ê¤«¡¤ ¤òͽÁÛ¤·¤Æ¤«¤é¼ÂºÝ¤Ë³Îǧ¤»¤è¡¥
  1. [[]]
  2. [[1; 3]; ["hoge"]]
  3. [3] :: []
  4. 2 :: [3] :: []
  5. [] :: []
  6. [(fun x -> x); (fun b -> not b)]
Exercise 2   sum_list¡¤max_list ¤ò¡¤match ¤ò»È¤ï¤º null, hd, tl ¤Î Áȹç¤ï¤»¤Î¤ß¤ÇÄêµÁ¤»¤è¡¥match ¤ò»È¤¦¥Æ¥­¥¹¥È¤ÎÄêµÁ¤ÈÈæ¤Ù¡¤µ­½ÒÌÌ ¤Ê¤É¤ÎÍø³²ÆÀ¼º¤òµÄÏÀ¤»¤è¡¥
Exercise 3   ¼¡¤Î´Ø¿ô¤òÄêµÁ¤»¤è¡¥
  1. Àµ¤ÎÀ°¿ô n ¤«¤é 0 ¤Þ¤Ç¤ÎÀ°¿ô¤Î¹ß½ç¥ê¥¹¥È¤òÀ¸À®¤¹¤ë´Ø¿ô downto0¡¥
  2. Í¿¤¨¤é¤ì¤¿Àµ¤ÎÀ°¿ô¤Î¥í¡¼¥Þ¿ô»úɽ¸½(ʸ»úÎó)¤òµá¤á¤ë´Ø¿ô roman¡¥ (I = 1, V = 5, X = 10, L = 50, C = 100, D = 500, M = 1000 ¤Ç¤¢¤ë¡¥) ¤¿¤À¤·¡¤roman ¤Ï¥í¡¼¥Þ¿ô»ú¤ÎÄêµÁ¤â°ú¿ô¤È¤·¤Æ¼õ¤±¼è¤ë¤³¤È¤Ë¤¹¤ë¡¥ ¥í¡¼¥Þ¿ô»úÄêµÁ¤Ï¡¤Ã±°Ì¤È¤Ê¤ë¿ô¤È¥í¡¼¥Þ¿ô»úɽ¸½¤ÎÁȤò Â礭¤¤¤â¤Î¤«¤éʤ٤¿¥ê¥¹¥È¤Çɽ¸½¤¹¤ë¡¥ Î㤨¤Ð
    roman [(1000, "M"); (500, "D"); (100, "C"); (50, "L"); 
           (10, "X"); (5, "V"); (1, "I")] 1984 
    =⇒ "MDCCCCLXXXIIII"
    
    4, 9, 40, 90, 400, 900 ¤Ê¤É¤Îɽ¸½¤Ë¤âÃí°Õ¤·¤Æ¡¤
    roman [(1000, "M"); (900, "CM"); (500, "D"); (400, "CD"); 
           (100, "C"); (90, "XC"); (50, "L"); (40, "XL"); 
           (10, "X"); (9, "IX"); (5, "V"); (4, "IV"); (1, "I")] 1984 
    =⇒ "MCMLXXXIV"
    
    ¤È¤Ê¤ë¤è¤¦¤Ë¤»¤è¡¥
  3. Í¿¤¨¤é¤ì¤¿¥ê¥¹¥È¤Î¥ê¥¹¥È¤ËÂФ·¡¤Æ⦤Υꥹ¥È¤ÎÍ×ÁǤòʤ٤¿¥ê¥¹¥È¤òÊÖ ¤¹´Ø¿ô concat¡¥
    concat [[0; 3; 4]; [2]; [5; 0]; []] = [0; 3; 4; 2; 5; 0]
    
  4. Æó¤Ä¤Î¥ê¥¹¥È [a1; ...; an] ¤È [b1; ...; bn] ¤ò°ú¿ô¤È¤·¤Æ¡¤ [(a1, b1); ...; (an, bn)] ¤òÊÖ¤¹´Ø¿ô zip¡¥(Í¿¤¨¤é¤ì¤¿¥ê¥¹¥È¤ÎĹ ¤µ¤¬°Û¤Ê¤ë¾ì¹ç¤ÏŤ¤¥ê¥¹¥È¤Î;¤Ã¤¿Éôʬ¤ò¼Î¤Æ¤Æ¤è¤¤¡¥)
  5. ¥ê¥¹¥È¤È¡¤¥ê¥¹¥È¤ÎÍ×ÁǾå¤Î½Ò¸ì( bool ·¿¤òÊÖ¤¹´Ø¿ô) p ¤ò¤È¤Ã¤Æ¡¤ p ¤òËþ¤¿¤¹Á´¤Æ¤ÎÍ×ÁǤΥꥹ¥È¤òÊÖ¤¹´Ø¿ô filter¡¥
    # let positive x = (x > 0);;
    val positive : int -> bool = <fun>
    # filter positive [-9; 0; 2; 5; -3];;
    - : int list = [2; 5]
    # filter (fun l -> length l = 3) [[1; 2; 3]; [4; 5]; [6; 7; 8]; [9]];;
    - : int list list = [[1; 2; 3]; [6; 7; 8]]
    
  6. ¥ê¥¹¥È¤ò½¸¹ç¤È¤ß¤Ê¤·¤Æ¡¤°Ê²¼¤Î½¸¹ç±é»»¤ò¤¹¤ë´Ø¿ô¤òÄêµÁ¤»¤è¡¥
    1. belong a s ¤Ç a ¤¬ s ¤ÎÍ×ÁǤ«¤É¤¦¤«¤òȽÄꤹ¤ë´Ø¿ô belong¡¥
    2. intersect s1 s2 ¤Ç s1 ¤È s2 ¤Î¶¦ÄÌÉôʬ¤òÊÖ¤¹´Ø¿ô intersect¡¥
    3. union s1 s2 ¤Ç s1 ¤È s2 ¤ÎϤòÊÖ¤¹´Ø¿ô union¡¥
    4. diff s1 s2 ¤Ç s1 ¤È s2 ¤Îº¹¤òÊÖ¤¹´Ø¿ô diff¡¥
    ⤷¡¤½¸¹ç¤Ê¤Î¤Ç¡¤Í×ÁǤϽÅÊ£¤·¤Æ¸½¤ì¤Æ¤Ï¤Ê¤é¤Ê¤¤¤³¤È¤Ëµ¤¤ò¤Ä¤±¤è¡¥ (´Ø¿ô¤Î°ú¿ô¤Ë¤Ï½ÅÊ£¤·¤Æ¤Ê¤¤¤â¤Î¤¬Í¿¤¨¤é¤ì¤ë¤È¤¤¤¦²¾Äê¤òÃÖ¤¤¤Æ¤â¤è¤¤¡¥)
Exercise 4  f, g ¤òŬÅö¤Ê·¿¤Î´Ø¿ô¤È¤¹¤ë¡¥ map f (map g l) ¤ò map ¤ò°ìÅÙ¤·¤«»ÈÍѤ·¤Ê¤¤Æ±¤¸°ÕÌ£¤Î¼° ¤Ë½ñ¤­´¹¤¨¤è¡¥map (fun x -> ...) l ¤Î ... Éôʬ¤Ï?
Exercise 5   forall, exists ¤ò fold_right, map ¤òÁȤ߹ç¤ï¤»¤ÆÄêµÁ¤»¤è¡¥
Exercise 6   quick ´Ø¿ô¤ò @ ¤ò»È¤ï¤Ê¤¤¤è¤¦¤Ë½ñ¤­´¹¤¨¤ë¡¥quicker ¤Ï̤¥½¡¼¥È¤Î¥ê¥¹¥È l ¤È¡¤sorted ¤È¤¤¤¦¥½¡¼¥ÈºÑ¤Ç¤½¤ÎÍ×ÁǤκǾ®ÃÍ ¤¬ l ¤ÎÍ×ÁǤκÇÂçÃͤè¤êÂ礭¤¤¤è¤¦¤Ê¥ê¥¹¥È¤ò¼õ¤±¼è¤ë¡¥ ÄêµÁ¤ò´°À®¤µ¤»¤è¡¥

let rec quicker l sorted = ...
Exercise 7   Í¿¤¨¤é¤ì¤¿¼«Á³¿ô r ¤ËÂФ·¤Æ x2 + y2 = r ¤Ç¤¢¤ë¤è¤¦¤Ê¡¤ (x,y) (¤¿¤À¤· xy ≥ 0)¤ÎÁȤòÁ´¤Æ¥ê¥¹¥È¤È¤·¤ÆÎóµó¤¹¤ë´Ø ¿ô squares r ¤òÄêµÁ¤»¤è¡¥(¸¡»»ÍÑ»ñÎÁ: r = 48612265 ¤Î»þ 32 ¸Ä¤Î²ò ¤¬¤¢¤ë¤½¤¦¤Ç¤¹¡¥)
Exercise 8   map ¤ÎÄêµÁ¤ÏËöÈøºÆµ¢Åª¤Ç¤Ï¤Ê¤¤¤¿¤á¡¤ÆþÎϥꥹ¥È¤ÎŤµ¤¬Ä¹¤¯¤Ê¤ë¤È¤½¤ì ¤ËÈæÎ㤷¤¿Î̤Υá¥â¥ê(¥¹¥¿¥Ã¥¯)¤¬É¬Íפˤʤ롥map ¤ÈƱµ¡Ç½¤Ç¡¤É¬Í×¤Ê ¥á¥â¥êÎ̤¬Äê¿ô¥ª¡¼¥À¡¼¤Ç¤¢¤ë map2 ¤òÄêµÁ¤»¤è¡¥(¥Ò¥ó¥È: ËöÈøºÆµ¢Åª (iterative) ¤Ê´Ø¿ô¤ò»È¤¦¡¥)

Previous Up Next