¤³¤ì¤Þ¤Ç¡¤¹½Â¤¤Î¤¢¤ë¥Ç¡¼¥¿¤òɽ¸½¤¹¤ë¤¿¤á¤Î¼êÃʤȤ·¤Æ¤ÏÁÈ ¤òÍѤ¤¤Æ¤¤¿¡¥¤³¤³¤Ç¤Ï¥ê¥¹¥È(lists)¤È¤¤¤¦¡¤ ¡Ö¥Ç¡¼¥¿¤Î(͸Â)Îó¡×¤òɽ¸½¤¹¤ë¥Ç¡¼¥¿¹½Â¤¤ò¤ß¤Æ¤¤¤¯¡¥ ¥ê¥¹¥È¤Ï¹½Â¤¼«ÂΤ¬ºÆµ¢Åª¤Ç¤¢¤ë¡¥¤Þ¤¿¡¤³ÊǼ¤¹¤ë¥Ç¡¼¥¿¤Î¼ïÎà ¤¬ÊѤï¤ê¤¦¤ë¤È¤¤¤¦°ÕÌ£¤Ç¿ÁêŪ¤Ç¤¢¤ë¤È¤¤¤¦ÆÃħ¤ò¤â¤Ã¤Æ¤¤¤ë¡¥
¤Þ¤º¤Ï´Êñ¤Ê¥ê¥¹¥È¤ÎÎã¤ò¸«¤Æ¤ß¤è¤¦¡¥¥ê¥¹¥È¤Ï¥Ç¡¼¥¿Îó¤ò¹½À®¤¹¤ë Í×ÁǤò ; ¤Ç¶èÀڤꡤ[]¤Ç°Ï¤à¤³¤È¤Ç¹½À®¤µ¤ì¤ë¡¥
# [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ÈÖÌܤÎÎã¤Ï¡¤À°¿ô¥ê¥¹¥È¤Î¥ê¥¹¥È¤ËÀ°¿ô¥ê¥¹¥È¤ò :: ¤ÇÄɲ䷤Ƥ¤¤ë¡¥
¤µ¤Æ¡¤¥ê¥¹¥È¤ÎÍ×ÁǤ˥¢¥¯¥»¥¹¤¹¤ë¤È¤¤Ë¤ÏÁÈ¤ÈÆ±Íͤ˥ѥ¿¡¼¥ó¤òÍѤ¤¤ë¡¥ ¥ê¥¹¥È¥Ñ¥¿¡¼¥ó¤Ï
[⟨ ¥Ñ¥¿¡¼¥ó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 ¼°¤¬¥Þ¥Ã¥Á¥ó¥°¤ò½çÈ֤˹Ԥ¦¡¤¤È¤¤¤¦¤Î¤ÏÈó¾ï¤Ë½ÅÍ×¤Ê ÅÀ¤Ç¤¢¤ë¡¥¤â¤·¤â¡¤Æ±¤¸Ãͤ¬Ê£¿ô¤Î¥Ñ¥¿¡¼¥ó¤Ë¥Þ¥Ã¥Á¤¹¤ë¾ì¹ç¤ÏÀè¤Ë ½ñ¤¤¤Æ¤¢¤ë¥Ñ¥¿¡¼¥ó¤Ë¥Þ¥Ã¥Á¤·¤Æ¤·¤Þ¤¦¡¥¤³¤Î¤è¤¦¤ÊÎã¤ÏÆÃ¤ËÄê¿ô¥Ñ ¥¿¡¼¥ó¤ò»ÈÍѤ¹¤ë¤ÈȯÀ¸¤·¤ä¤¹¤¤¡¥Äê¿ô¥Ñ¥¿¡¼¥ó¤ÏÀ°¿ô¡¤Ê¸»úÎóÄê¿ô¤ò ¥Ñ¥¿¡¼¥ó¤È¤·¤ÆÍѤ¤¤ë¤â¤Î¤Ç¡¤¤½¤ÎÄê¿ô¤Ë¤Î¤ß¥Þ¥Ã¥Á¤¹¤ë¡¥¤Þ¤¿¡¤ Á°¤Ë½ñ¤¤¤Æ¤¢¤ë¥Ñ¥¿¡¼¥ó¤Î¤»¤¤¤Ç¡¤¥Ñ¥¿¡¼¥ó¤Ë¥Þ¥Ã¥Á¤¹¤ëÃͤ¬¤Ê¤¤¾ì¹ç¡¤ ¥³¥ó¥Ñ¥¤¥é¤Ï “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>
¤Î¤è¤¦¤ËÄêµÁ¤µ¤ì¤ë¡¥
¤µ¤Æ¡¤¥ê¥¹¥È¤ËÂФ¹¤ë´ðËÜŪ¤ÊÁàºî(¹½À®¤ÈÍ×ÁÇ¥¢¥¯¥»¥¹)¤ò¤ß¤¿¤È¤³¤í¤Ç¡¤ ÍÍ¡¹¤Ê¥ê¥¹¥ÈÁàºî¤ò¹Ô¤¦´Ø¿ô¤ò¸«¤Æ¤¤¤³¤¦¡¥Â¿¤¯¤Î´Ø¿ô¤¬¥ê¥¹¥È¤Î¹½Â¤¤Ë´Ø¤· ¤ÆºÆµ¢Åª¤ËÄêµÁ¤µ¤ì¤ë¡¥¤Þ¤¿¡¤¤Û¤È¤ó¤É¤¹¤Ù¤Æ¤Î´Ø¿ô¤¬Í×ÁÇ·¿¤Ë¤è¤é¤Ê¤¤ÄêµÁ ¤ò¤·¤Æ¤¤¤ë¤¿¤á¡¤Â¿Áê·¿¤¬Í¿¤¨¤é¤ì¤ë¤³¤È¤ËÃí°Õ¤·¤è¤¦¡¥
¥ê¥¹¥È¤ÎÀèÆ¬Í×ÁÇ¡¤¥ê¥¹¥È¤ÎÀèÆ¬¤ò½ü¤¤¤¿»Ä¤ê¤òÊÖ¤¹´Ø¿ô 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 ⟩
¤ò¼¨¤¹¡¥ºÇ¸å¤Ë¼õ¤±¼è¤Ã¤¿°ú¿ô¤Ë´Ø¤·¤ÆÂ¨ºÂ¤Ë¥Ñ¥¿¡¼¥ó¥Þ¥Ã¥Á¤ò¹Ô¤¦¤è¤¦¤Ê ´Ø¿ôÄêµÁ¤ÎºÝ¤ËÊØÍø¤Ç¤¢¤ë¡¥
¼¡¤Ï¡¤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 ¤Ç¤¢¤ë¡¥
# 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 ´Ø¿ô¤Ï¥ê¥¹¥ÈƱ»Î¤òÏ¢·ë¤¹¤ë´Ø¿ô¤Ç¤¢¤ë¡¥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 ¤Ï¥ê¥¹¥È¤Î³ÆÍ×ÁǤËÂФ·¤ÆÆ±¤¸´Ø¿ô¤òŬÍѤ·¤¿·ë²Ì¤Î¥ê¥¹¥È¤òµá¤á¤ë ¤¿¤á¤Î¹â³¬´Ø¿ô¤Ç¤¢¤ë¡¥
# 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 ¤Ï¥ê¥¹¥È¤ÎÍ×ÁǤ˴ؤ¹¤ë½Ò¸ì(Í×ÁǤ«¤é 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
¾å¤Ç¸«¤¿ 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).
Ï¢Áۥꥹ¥È¤Ë¤Ê¤¤¥¡¼¤ÇÌ䤤¹ç¤ï¤»¤ò¹Ô¤¦¤È¡¤ºÆµ¢¸Æ¤Ó½Ð¤·¤¬¥ê¥¹¥È¤ÎËöü¤Þ¤Ç Åþ㤷¤¿Ëö¤Ë¥Þ¥Ã¥Á¥ó¥°¤Ë¼ºÇÔ¤·¤ÆÎã³°¤òȯÀ¸¤¹¤ë¡¥
¥ê¥¹¥È¤ò»È¤Ã¤¿¥½¡¼¥È¥¢¥ë¥´¥ê¥º¥à¤ò¤¤¤¯¤Ä¤«¤ß¤Æ¤¤¤³¤¦¡¥°Ê²¼¤Ç¤Ï ¥ê¥¹¥È¤ò < ¤Ë´Ø¤¹¤ë¾º½ç(¾®¤µ¤¤Êý¤«¤é½ç)¤ËʤÙÂØ¤¨¤ë¤³¤È¤ò¹Í¤¨¤ë¡¥ (Èæ³Ó±é»»»Ò < ¤Ï¿ÁêŪ¤Ç¤¢¤ë¤¿¤á¡¤¥½¡¼¥È´Ø¿ô¤â¿ÁêŪ¤Ë»È¤¨¤ë¡¥)
¤Þ¤º¤Ï½àÈ÷¤È¤·¤Æ¡¤¥½¡¼¥È¤ÎÂоݤȤ·¤ÆÍѤ¤¤ë¡¤µ¿»÷Íð¿ôÎó¤òÀ¸À®¤¹¤ë¤¿¤á ¤Î´Ø¿ô¤òÄêµÁ¤¹¤ë¡¥
# 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 ¤Ï¥Ú¥¢¤«¤éÂèÆóÍ×ÁǤò¼è¤ê½Ð¤¹ÄêµÁºÑ¤Î´Ø¿ô¤Ç¤¢¤ë¡¥)
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"¤È¤Ê¤ë¤è¤¦¤Ë¤»¤è¡¥
concat [[0; 3; 4]; [2]; [5; 0]; []] = [0; 3; 4; 2; 5; 0]
# 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]]
let rec quicker l sorted = ...