Objective Caml ÆþÌç¸Þ½½Íò ½ß |
¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì ML ¤Ï¸µ¡¹¡¤Edinburgh LCF ¤È¤¤¤¦¡¤·×»»µ¡¤Ë¤è¤ë¾ÚÌÀµ ½Ò¥·¥¹¥Æ¥à¤Î¤¿¤á¤Ë³«È¯¤µ¤ì¤Æ¤¤¿¡¥¾ÚÌÀµ½Ò¥·¥¹¥Æ¥à¤Ç¤Ï¡¤¾ÚÌÀ¤½¤Î¤â¤Î¤ò µ½Ò¤¹¤ë¸À¸ì¤È¡¤¾ÚÌÀ¤òÁàºî¤¹¤ë(¾ÚÌÀ¤ò¤É¤Î¤è¤¦¤Ê¼ê½ç¤Ç¹Ô¤Ê¤¦¤« ¤Ê¤É¤òÀ©¸æ¤¹¤ë)¤¿¤á¤Î¸À¸ì¤¬»È¤ï¤ì¤Æ¤¤¤ë¡¥Á°¼Ô¤òÂоݸÀ¸ì—object language—¤È¸Æ¤Ó¡¤¸å¼Ô¤ò¥á¥¿¸À¸ì—meta language—¤È¸Æ¤Ö¡¥ML ¤Ï¤³¤Î ¾ÚÌÀÁàºîÍѤΥ᥿¸À¸ì(Ƭʸ»ú¤ò¤È¤Ã¤Æ ML)¤«¤éȯŸ¤·¤Æ¤¤¿¸À¸ì¤Ç¡¤´Ø¿ô·¿ ¥×¥í¥°¥é¥ß¥ó¥°¤È¸Æ¤Ð¤ì¤ë¥×¥í¥°¥é¥ß¥ó¥°¥¹¥¿¥¤¥ë¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤ë¡¥ML¤Ï ³Ë¤È¤Ê¤ëÉôʬ¤¬¾®¤µ¤¯¥·¥ó¥×¥ë¤Ç¤¢¤ë¤¿¤á¡¤¥×¥í¥°¥é¥ß¥ó¥°½é¿´¼Ô¸þ¤±¤Î¶µ°é ÍѤËŬ¤·¤¿¸À¸ì¤Ç¤¢¤ë¤ÈƱ»þ¤Ë¡¤Â絬ÌϤʥ¢¥×¥ê¥±¡¼¥·¥ç¥ó³«È¯¤Î¤¿¤á¤Î¥µ¥Ý¡¼ ¥È(¥â¥¸¥å¡¼¥ë¥·¥¹¥Æ¥à¡¦¥é¥¤¥Ö¥é¥ê)¤¬½¼¼Â¤·¤Æ¤¤¤ë¡¥ML¤Î³Ë¸À¸ì¤Ï·¿ÉÕ¤ λ·×»»¤È¸Æ¤Ð¤ì¤ë¡¤·Á¼°Åª¤Ê·×»»¥â¥Ç¥ë¤Ë´ð¤Å¤¤¤Æ¤¤¤ë¡¥¤³¤Î¤³¤È ¤Ï¡¤¸À¸ì»ÅÍͤò·Á¼°Åª¤Ë(¿ô³ØÅª¤Ê¸·Ì©¤Ê³µÇ°¤òÍѤ¤¤Æ)ÄêµÁ¤·¡¤¤½¤ÎÀ¼Á¤ò¸· Ì©¤Ë¡Ö¾ÚÌÀ¡×¤¹¤ë¤³¤È¤ò²Äǽ¤Ë¤·¤Æ¤¤¤ë¡¥¼ÂºÝ¡¤Standard ML ¤È¤¤¤¦É¸½à²½¤µ ¤ì¤¿¸À¸ì»ÅÍÍ []¤Ë¤ª¤¤¤Æ¤Ï¡¤(¥³¥ó¥Ñ¥¤¥é¤Î¼õÍý¤¹¤ë)Àµ¤·¤¤¥×¥í ¥°¥é¥à¤Ï·è¤·¤ÆÌ¤ÄêµÁ¤Îưºî¤ò¤ª¤³¤µ¤Ê¤¤¡¤¤È¤¤¤Ã¤¿À¼Á¤¬¼¨¤µ¤ì¤Æ¤¤¤ë¡¥
¤³¤Î±é½¬¤Ç³Ø¤Ö¤Î¤Ï ML ¤ÎÊý¸À¤Ç¤¢¤ë Objective Caml ¤È¤¤¤¦¸À¸ì¤Ç¤¢¤ë¡¥Objective Caml ¤Ï INRIA ¤È¤¤¤¦¥Õ¥é¥ó¥¹¤Î¹ñΩ¤Î·×»»µ¡²Ê³Ø¤Î¸¦µæ½ê¤Ç¥Ç¥¶¥¤¥ó³«È¯¤µ¤ì¤¿ ¸À¸ì¤Ç¡¤Standard ML ¤È¤ÏʸˡŪ¤Ë°ã¤Ã¤¿¸À¸ì¤Ç¤¢¤ë¤¬¡¤¤Û¤È¤ó¤É¤Î³µÇ°¡¦µ¡ ǽ¤Ï¶¦Í¤·¤Æ¤¤¤ë¡¥¤Þ¤¿¡¤Objective Caml ¤Ç¤Ï Standard ML ¤Ë¤Ï¸«¤é¤ì¤Ê¤¤¡¤ÆÈ¼« ¤Î³ÈÄ¥¤¬Â¿¤¯»Ü¤µ¤ì¤Æ¤ª¤ê¡¤´Ø¿ô·¿¥×¥í¥°¥é¥ß¥ó¥°¤À¤±¤Ç¤Ê¤¯¡¤¥ª¥Ö¥¸¥§¥¯¥È »Ø¸þ¥×¥í¥°¥é¥ß¥ó¥°¤â¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤ë¡¥¤Þ¤¿¥³¥ó¥Ñ¥¤¥é¤â¸úΨ¤Î¤è¤¤¤â¤Î¤¬ ³«È¯¤µ¤ì¤Æ¤¤¤ë¡¥
ML ¤ÎÆÃħ¤È¤·¤Æ¤Ï¡¤°Ê²¼¤Î¤è¤¦¤Ê¤â¤Î¤¬µó¤²¤é¤ì¤ë¡¥
¤Þ¤¿¡¤Objective Caml ÆÈ¼«¤ÎÆÃħ¤È¤·¤Æ¤Ï¡¤
¤Ê¤É¤¬µó¤²¤é¤ì¤ë¡¥
Objective Caml ¤Î¥Þ¥Ë¥å¥¢¥ë [] (±Ñ¸ì)¤Ï ¤è¤ê¥ª¥ó¥é¥¤¥óÍøÍѤ¬²Äǽ¤Ê¤è¤¦¤Ë¤·¤Æ¤¢¤ë¡¥ ¤Þ¤¿ ¤«¤é¡¤FAQ ¤Ê¤É¤Îʸ½ñ¡¤½èÍý·Ï¤Î¥½¡¼¥¹¡¦¥³¥ó¥Ñ¥¤¥ëºÑ ¥Ð¥¤¥Ê¥ê¡¤Objective Caml ¤ò»È¤Ã¤¿¥½¥Õ¥È¥¦¥§¥¢¤Ê¤É¤¬ÍøÍѤǤ¤ë¡¥ Objective Caml ¤Ï¡¤Caml ¤È¤¤¤¦¸À¸ì¤ò³ÈÄ¥¤·¤Æ¡¤¥ª¥Ö¥¸¥§¥¯¥È»Ø¸þ¥×¥í¥°¥é¥ß¥ó¥° ¤Îµ¡Ç½¤Ê¤É¤ò²Ã¤¨¤¿¤â¤Î¤Ç¤¢¤ë¤¬¡¤ËÜÍè¤Î Caml ¤Î¶µ²Ê½ñ¤È¤·¤Æ []¤¬½ÐÈǤµ¤ì¤Æ¤¤¤ë¡¥¤Þ¤¿¡¤¥Õ¥é¥ó¥¹¸ì¤Î Objective Caml ¤ÎËܤ¬ O'Reilly ¤«¤é½ÐÈǤµ¤ì¤Æ¤¤¤ë¤¬¡¤¸½ºß¡¤±ÑÌõ¥×¥í¥¸¥§¥¯¥È¤¬¿Ê¹ÔÃæ¤Ç¡¤¥ª¥ó ¥é¥¤¥ó¤Çhttp://caml.inria.fr/oreilly-book/ ¤è¤êÍøÍѲÄǽ¤Ë¤Ê¤Ã¤Æ ¤¤¤ë¡¥°ìÊý¡¤Standard ML¤Î¶µ²Ê½ñ¤Ï¤½¤ì¤ËÈæ¤Ù¤ì¤Ð¿¿ô½ÐÈǤµ¤ì¤Æ¤¤¤ë [, , ]¤¬¡¤Objective Caml¤È¤Ïʸˡ¤ò´Þ¤áÈù̯¤Ë°Û¤Ê¤ë¤Î¤Ç ML ÆþÌç¼Ô¤Ï¤«¤¨¤Ã¤Æº®Í𤹤뤫¤â¤·¤ì¤Ê¤¤¡¥
[]¤Ï¡¤ºÆµ¢/·¿¤Î³µÇ°¤òÂÐÏ÷Á¼°¤ÇÊ¿°×¤Ë ²òÀ⤷¤Æ¤¤¤ë°ìÉ÷ÊѤä¿ËܤǤ¢¤ë¡¥ÆÉ¤ß¤ä¤¹¤¤¤Î¤Ç¡¤¤³¤Î¼Â¸³¤Ç¶½Ì£¤ò»ý¤Ã¤¿¤éÆÉ ¤ó¤Ç¤ß¤ë¤ÈÌÌÇò¤¤¤À¤í¤¦¡¥
´Ä¶ÀßÄê¤Ï¡¤Emacs ¥¨¥Ç¥£¥¿¤Ç¤Î ¥×¥í¥°¥é¥àÊÔ½¸/¼Â¹Ô¤Î¤¿¤á¤ÎÀßÄê¤ò¹Ô¤¦¡¥
Emacs (Mule) ¾å¤Ç Objective Caml¥×¥í¥°¥é¥à¤ÎÊÔ½¸¤ò½õ¤±¤ë¥×¥í¥°¥é¥à tuareg-mode () ¤¬~igarashi/lib/elisp ¤Ë¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì ¤Æ¤¤¤ë¡¥°Ê²¼¤Ï ~/.emacs ¤Ë²Ã¤¨¤ëÀßÄê¤Ç¤¢¤ë¡¥
;; append-tuareg.el - Tuareg quick installation: Append this file to .emacs.
(setq load-path (cons "~igarashi/lib/elisp/tuareg-mode" load-path))
(setq auto-mode-alist (cons '("\.ml\w?" . tuareg-mode) auto-mode-alist))
(autoload 'tuareg-mode "tuareg" "Major mode for editing Caml code" t)
(autoload 'camldebug "camldebug" "Run the Caml debugger" t)
(if (and (boundp 'window-system) window-system)
(when (string-match "XEmacs" emacs-version)
(if (not (and (boundp 'mule-x-win-initted) mule-x-win-initted))
(require 'sym-lock))
(require 'font-lock)))
Emacs ¤òµ¯Æ°¤·Ä¾¤·¤Æ¡¤.ml ¤È¤¤¤¦³ÈÄ¥»Ò¤ò»ý¤Ä¥Õ¥¡¥¤¥ë¤ò³«¤¤¤¿¤È¤¤Ë ¥â¡¼¥É¥é¥¤¥ó¤Ë (Tuareg) ¤Èɽ¼¨¤µ¤ì¤ë¤³¤È¤ò³Îǧ¤¹¤ë¤³¤È¡¥
¤Ê¤ª¡¤°Ê¾å¤ÎÀßÄê¤Ï¡¤¼ø¶ÈWWW¥Ú¡¼¥¸¤Î¼ø¶È¥¹¥±¥¸¥å¡¼¥ëÍó¤Î´Ä¶ÀßÄê (http://www.sato.kuis.kyoto-u.ac.jp/~igarashi/class/isle4/configure.txt) ¤è¤ê¥ª¥ó¥é¥¤¥ó¤ÇÍøÍѤǤ¤ë¤Î¤Ç¡¤¥«¥Ã¥È¡õ¥Ú¡¼¥¹¥È¤¹¤ë¤È¤è¤¤¤À¤í¤¦¡¥
Objective Caml½èÍý·Ï¤Ë¤Ï2¼ïÎà¤Î¥³¥ó¥Ñ¥¤¥é¤¬ÍѰդµ¤ì¤Æ¤¤¤ë¡¥¤Ò¤È¤Ä¤Ï gcc ¤ä javac ¤Ê¤É¤Î¤è¤¦¤Ë¡¤¥½¡¼¥¹¥Õ¥¡¥¤¥ë¤«¤é¼Â¹Ô¤Î¤¿¤á¤Î¥Õ¥¡¥¤¥ë¤òÀ¸À®¤¹¤ë¥Ð¥Ã ¥Á¥³¥ó¥Ñ¥¤¥é ocamlc¡¤¤â¤¦¤Ò¤È¤Ä¤Ï¡¤¥æ¡¼¥¶¤«¤é¤ÎÆþÎϤò¥¤¥ó¥¿¥é¥¯¥Æ¥£¥Ö¤Ë ½èÍý¤¹¤ë ocaml ¤Ç¤¢¤ë¡¥¤³¤Î¥¤¥ó¥¿¥é¥¯¥Æ¥£¥Ö¤Ê½èÍý·Ï¤Ï¡¤(¥æ¡¼¥¶¤«¤é¤Î)¥× ¥í¥°¥é¥à¤ÎÆþÎÏ → ¥³¥ó¥Ñ¥¤¥ë → ¼Â¹Ô¡¦·ë²Ì¤Îɽ¼¨¡¤¤ò ·«¤êÊÖ¤¹¤â¤Î¤Ç1 ¡¤Ä¾Á°¤Ç¼Â¹Ô¤µ¤ì¤¿¥×¥í¥°¥é¥à¤Î·ë²Ì¤¬¼¡¤ÎÆþÎÏ»þ¤ËÈ¿±Ç¤µ¤ì¤ë ¤¿¤á¡¤³«È¯Ãæ¤Î¥Æ¥¹¥È¤Ê¤É¡¤»î¹Ôºø¸í¤òȼ¤¦²áÄø¤ÇÆÃ¤ËÊØÍø¤Ê¤â¤Î¤Ç¤¢¤ë¡¥¤Þ¤¿¡¤ ¸å½Ò¤¹¤ë¤è¤¦¤Ë¡¤ÆþÎϤϥ¡¼¥Ü¡¼¥É¤«¤é¤À¤±¤Ç¤Ê¤¯¡¤¥Õ¥¡¥¤¥ë¤«¤é¤ÎÆÉ¤ß¹þ¤ß¤â¤Ç¤ ¤ë¤Î¤Ç¡¤Ëè²ó¥×¥í¥°¥é¥à¤òºÇ½é¤«¤éÂǤ¿¤Ê¤±¤ì¤Ð¤¤¤±¤Ê¤¤¤Ê¤É¤ÎÉÔÊØ¤â¤Ê¤¤¡¥
;Ã̤Ǥ¢¤ë¤¬¡¤´Ø¿ô·¿¸À¸ì½èÍý·Ï¤Ë¤Ï¥¤¥ó¥¿¥é¥¯¥Æ¥£¥Ö¤Ê½èÍý·Ï¤¬ÍѰդµ¤ì¤Æ ¤¤¤ë¤â¤Î¤¬Â¿¤¤¤è¤¦¤À¡¥
¤³¤Î±é½¬¤Ç¤Ï¡¤¤Þ¤º ocaml ¤ÎÊý¤òÍѤ¤¤Æ¿Ê¤á¤Æ¤¤¤¯¡¥
µ¯Æ°ÊýË¡¤ÏEmacs ¤Ç M-x tuareg-run-caml (M-x ¤Ï¥¨¥¹¥±¡¼¥×¥¡¼¤Ë³¤¤¤Æ x ¤ò¥¿¥¤¥×¤¹¤ë) ¤È¤¹¤ë(¸å½Ò¤¹¤ë Tuareg mode ¤Î¥Ð¥Ã¥Õ¥¡¤«¤é¤Ï C-c C-s ¤Çµ¯Æ°¤Ç¤¤ë)¡¥ ¥ß¥Ë¥Ð¥Ã¥Õ¥¡(²èÌ̤κDz¼ÃÊ)¤Ë Caml toplevel to run: ¤È¤¤¤¦¥×¥í¥ó¥×¥È¤È ¤È¤â¤Ë¡¤µ¯Æ°¤¹¤ë¥³¥Þ¥ó¥É¤òʹ¤«¤ì¤ë¤¬(´û¤Ë ocaml ¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤³¤È¤ò³Î ǧ¤·)¡¤¤½¤Î¤Þ¤Þ Enter ¥¡¼¤ò¥¿¥¤¥×¤¹¤ë¡¥¤¹¤ë¤È¡¤°Ê²¼¤Î¤è¤¦¤ÊÆâÍÆ¤Î¿·¤· ¤¤¥Ð¥Ã¥Õ¥¡¤¬¸½¤ï¤ì¤ë¡¥
Objective Caml version 3.08.1
#
# ¤Ï¥¤¥ó¥¿¥é¥¯¥Æ¥£¥Ö¥³¥ó¥Ñ¥¤¥é¤ÎÆþÎÏ¥×¥í¥ó¥×¥È¤Ç¤¢¤ë¡¥
¤µ¤Æ¡¤¥×¥í¥ó¥×¥È¤Ë³¤¤¤Æ¡¤´Êñ¤Ê¼°¤òÆþÎϤ·¤Æ¤ß¤è¤¦¡¥
# 1 + 1;; - : int = 2
¤³¤Î¥Æ¥¥¹¥È¤Ç¤Ï¡¤¥æ¡¼¥¶¤ÎÆþÎϤò¹ÔƬ¤Ë#¤ò¤Ä¤±¡¤¥¿¥¤¥×¥é¥¤¥¿¡¼ÂÎ (abc)¤Ç¡¤¥³¥ó¥Ñ¥¤¥é¤«¤é¤Î½ÐÎϤò¥¿¥¤¥×¥é¥¤¥¿¡¼¼ÐÂÎ (abc)¤Ç¼¨¤¹¡¥ºÇ¸å¤Î ;; ¤ÏÆþÎϽªÎ»¤Î¤·¤ë¤·¤Ç¡¤¥×¥í¥ó¥× ¥È¤«¤é¤³¤³¤Þ¤Ç¤ÎÉôʬ¤¬¥³¥ó¥Ñ¥¤¥ë¡¦¼Â¹Ô¤µ¤ì¤ë¡¥(ÅÓÃæ¤Ë²þ¹Ô¤¬¤¢¤Ã¤Æ¤â¤è¤¤¡¥) ¥³¥ó¥Ñ¥¤¥é¤Î½ÐÎϤϡ¤É¾²Á·ë²Ì¤Ë¤Ä¤±¤é¤ì¤¿Ì¾Á°(¤³¤³¤Ç¤Ï¼°¤À¤±¤òÆþÎϤ·¤¿¤Î¤Ç¡¤ ̾Á°¤ò¤Ä¤±¤Æ¤¤¤Ê¤¤¤È¤¤¤¦°ÕÌ£¤Ç¤¢¤ë -)¡¤¼°¤ª¤è¤Óɾ²Á·ë²Ì¤Î·¿ (int)¡¤É¾²Á·ë²Ì(2)¤«¤é¤Ê¤Ã¤Æ¤¤¤ë¡¥
Ê£»¨¤Ê¼°¤Ï¡¤()¤Ç°Ï¤à¤³¤È¤Ç¡¤Éôʬ¼°¤Î¹½Â¤¤ò¼¨¤¹¤³¤È¤¬¤Ç¤¤ë¡¥¤Þ¤¿¡¤Â¿¤¯¤Î ±é»»¤Ë¤Ï¾ï¼±Åª¤Ê·ë¹ç¤Î¶¯¤µ¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤Æ¡¤()¤ò¾Êά¤Ç¤¤ë¡¥
# 1 + 2 * 3;; - : int = 7 # (1 + 2) * 3;; - : int = 9
¤Þ¤¿¡¤ÆþÎÏÃæ ;; ¤òÆþÎϤ¹¤ëÁ°¤Ë Control-C ¤ò2²ó³¤±¤ÆÆþÎϤ¹¤ë¤³¤È¤Ç ¥³¥ó¥Ñ¥¤¥ë¤»¤º¡¤¥×¥í¥ó¥×¥È¤ËÌá¤ë¤³¤È¤¬¤Ç¤¤ë¡¥
¤³¤Î¥Ð¥Ã¥Õ¥¡¤Ç¤Ï¼°¤ÎÆþÎϤò½õ¤±¤ë¥³¥Þ¥ó¥É¤¬¤¤¤¯¤Ä¤«ÍѰդµ¤ì¤Æ¤ª¤ê¡¤ Î㤨¤Ð M-p, M-n ¤Ç°ÊÁ°¤ËÆþÎϤ·¤¿¼°¤ò¸Æ¤Ó½Ð¤·¤¿¤ê¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡¥ (ɽ2.1¤Ë¥¡¼¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤ò¤Þ¤È¤á¤Æ¤¢¤ë¡¥)
Table 2.1: ¥³¥ó¥Ñ¥¤¥é¥Ð¥Ã¥Õ¥¡(Tuareg Interactive mode)Æâ¥¡¼¥Ð¥¤¥ó¥Ç¥£¥ó¥°
C-c C-c ÆþÎÏÅÓÃæ¤ÇÃæÃǤ·¥×¥í¥ó¥×¥È¤ËÌá¤ë C-c TAB Caml¤Ë³ä¤ê¹þ¤ß¤òÆþ¤ì¤ë C-c C-k Caml¤ò½ªÎ» M-p ²áµî¤ËÆþÎϤ·¤¿¼°¤ÎÍúÎò¤òÁ̤ë M-n ²áµî¤ËÆþÎϤ·¤¿¼°¤ÎÍúÎò¤ò¿·¤·¤¤Êý¤ØÃ©¤ë
¤µ¤Æ¡¤¤¤¤¯¤Ä¤«¸í¤Ã¤¿ÆþÎÏÎã¤Ë¤Ä¤¤¤Æ¤â¤ß¤Æ¤¤¤³¤¦¡¥
# 2 + 3 - ;; 2 + 3 - ;; ^^ Syntax error # 5 + "abc";; 5 + "abc";; ^^^^^ This expression has type string but is here used with type int # 4 / 0;; Exception: Division_by_zero.
(üËö¾å¤Ç¤Ï²¼Àþ¤Ç¼¨¤µ¤ì¤Æ¤¤¤ë¤«¤â¤·¤ì¤Ê¤¤¡¥) 1ÈÖÌÜ¤ÎÆþÎϤϡ¤¤¤¤ï¤æ¤ëʸˡ¥¨¥é¡¼¤Ç¤¢¤ë¡¥¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤Ï¤«¤Ê¤ê¤¢¤Ã¤µ¤ê¤· ¤Æ¤¤¤Æ¡¤C ¤ä Java ¥³¥ó¥Ñ¥¤¥é¤ËÈæ¤Ù¤Æ¤ä¤ä(¤«¤Ê¤ê?)ÉÔ¿ÆÀڤǤ¢¤ë¡¥2ÈÖÌܤϡ¤ÆþÎϤµ¤ì¤¿¼°¤Î¹½À®¼«ÂΤÏʸˡ¤Ë±è¤Ã¤Æ¤¤¤ë¤â¤Î¤Î¡¤·¿¥Á¥§¥Ã¥¯(typechecking) ¤òÄ̤é¤Ê¤«¤Ã¤¿¤³¤È¤ò¼¨¤¹¡¥Objective Caml ¤Ç¤Ï¡¤+ ¤ÎξÊդϡ¤À°¿ô¤Ëɾ²Á¤µ¤ì¤ë¼°¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡¥¤·¤«¤·¡¤ ¤³¤³¤Ç¤Ï "abc" ¤È¤¤¤¦Ê¸»úÎó¤ò²Ã¤¨¤è¤¦¤È¤·¤Æ¤¤¤ë¤¿¤á¥¨¥é¡¼¤È¤Ê¤Ã¤Æ¤¤¤ë¡¥¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤Ï¡¤ ¡Ö²¼ÀþÉô(¥¨¥é¡¼¤ÎȯÀ¸¤·¤¿¸Ä½ê)¤Ïʸ»úÎó·¿(string)¤Î¼°¤Ç¤¢¤ë¤Î¤Ë¡¤ À°¿ô·¿(int)¤¬É¬ÍפʸĽê(¤Ä¤Þ¤ê +¤Î±¦Â¦)¤Ç»È¤ï¤ì¤Æ¤¤¤ë¡×¤³¤È¤ò¼¨¤·¤Æ¤¤¤ë¡¥ ·¿(type)¤ä·¿¥Á¥§¥Ã¥¯¤Ï Objective Caml ¤Ç¤ÏÈó¾ï¤Ë½ÅÍפʳµÇ°¤Ç¡¤±é½¬¤òÄ̤·¤Æ¾Ü ¤·¤¯³Ø¤ó¤Ç¤¤¤¯¤³¤È¤Ë¤Ê¤ë¡¥ºÇ¸å¤ÎÎã¤Ç¤Ï¡¤¼°¤Ï·¿¥Á¥§¥Ã¥¯¤âÄ̤äƤ¤¤ë¤¬¡¤¥³¥ó ¥Ñ¥¤¥ë¸å¤Î¼Â¹ÔÃæ¤ËÎã³°(exception)—¤³¤³¤Ç¤Ï0¤Ç¤Î½ü»»—¤¬È¯À¸¤· ¤¿¤³¤È¤ò¼¨¤·¤Æ¤¤¤ë¡¥Îã³°¤Ë¤Ä¤¤¤Æ¤â¾Ü¤·¤¯³Ø¤Ö¤¬¡¤¤³¤³¤Ç¤Ï¤È¤ê¤¢¤¨¤º¼Â¹Ô»þ¤Î ¥¨¥é¡¼¤ÎȯÀ¸¤À¤È»×¤Ã¤Æ¤¤¤ì¤Ð¤è¤¤¡¥
½ªÎ»¤Ï¥×¥í¥ó¥×¥È¤Î½Ð¤Æ¤¤¤ë¾õÂÖ¤Ç C-c C-d ¤ò¡¤¤â¤·¤¯¤Ï #quit;; ¤ÈÆþÎϤ¹ ¤ë¤³¤È¤Ç¹Ô¤¦¡¥
Objective Caml version 3.08.3
# #quit;;
Process inferior-caml finished
ocaml Æâ¤Ç¤Ï¡¤¥³¥ó¥Ñ¥¤¥é¤Îưºî¤òÀ©¸æ¤¹¤ë¤¿¤á¤Î ¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤È¸Æ¤Ð¤ì¤ë¤¤¤¯¤Ä¤«¤ÎÌ¿Îá¤¬ÍøÍѤǤ¤ë¡¥¤¿¤È¤¨¤Ð¡¤¾å¤Ç¤Ç¤Æ¤¤¿ #quit ¤â¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤Î°ì¼ï¤Ç¤¢¤ë¡¥¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤Ï¿¿ô¤¢¤ë¤¬ ¤³¤³¤Ç¤Ï¥Õ¥¡¥¤¥ë¤«¤é¤Î¥×¥í¥°¥é¥àÆÉ¤ß¹þ¤ß¤Ë´Ø¤¹¤ë¤Õ¤¿¤Ä #use, #cd ¤ò¾Ò²ð¤¹¤ë¡¥¾Ü¤·¤¯¤Ï¥Þ¥Ë¥å¥¢¥ë[]¤ò»²¾È¤Î¤³¤È¡¥
#use ¤Ï¥Õ¥¡¥¤¥ë̾¤ò°ú¿ô¤Ë¤È¤Ã¤Æ¡¤¥Õ¥¡¥¤¥ë¤ÎÆâÍÆ¤òÆþÎϤȤ·¤Æ¥³¥ó¥Ñ¥¤¥ë¤ò ¹Ô¤¦¡¥
1 + 1;;
Objective Caml version 3.08.3
# #use "two.ml";;
- : int = 2
¤Á¤Ê¤ß¤Ë¡¤¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤Ï¸À¸ì¤Î¼°¤Ç¤Ï¤Ê¤¤¤Î¤Ç¡¤ ¼°¤Î°ìÉô¤ËËä¤á¹þ¤ó¤Ç»È¤¦¤³¤È¤Ï¤Ç¤¤Ê¤¤¡¥
# 1 + #use "two.ml";; 1 + #use "two.ml";; ^ Syntax error
#cd ¤Ï¡¤#use ¤ÈƱÍͤËʸ»úÎó¤ò°ú¿ô¤Ë¤È¤Ã¤Æ¡¤¥·¥§¥ë¤Î cd ¥³¥Þ¥ó¥É¤È ƱÍͤ˥«¥ì¥ó¥È¥Ç¥£¥ì¥¯¥È¥ê¤ò°ú¿ô¤Î¤â¤Î¤ØÊѹ¹¤¹¤ë¤â¤Î¤Ç¤¢¤ë¡¥
±é½¬¤Î¥ì¥Ý¡¼¥È¤Ï¡¤¥×¥í¥°¥é¥à¥Õ¥¡¥¤¥ë¤òÄó½Ð¤¹¤ë¤³¤È¤Ë¤Ê¤ë¤Î¤Ç¡¤ ¼ç¤ËÊÌ¥Õ¥¡¥¤¥ë¤Ë¥×¥í¥°¥é¥à¤ò½ñ¤¤¤Æ¡¤#use ¤Ç¥³¥ó¥Ñ¥¤¥é¤ËÆÉ¤ß¹þ¤ó¤Ç ¥Æ¥¹¥È¤ò¤¹¤ë¤³¤È¤Ë¤Ê¤ë¡¥¤³¤Î»þ¡¤¥Õ¥¡¥¤¥ë̾¤Î³ÈÄ¥»Ò¤È¤·¤Æ .ml ¤ò»ý¤Ä¥Õ¥¡¥¤¥ë¤òÆÉ¤ß¹þ¤à¤È¡¤Tuareg mode ¤È¤¤¤¦ Objective Caml¥×¥í¥°¥é¥à¤Î ÆþÎϤò»Ù±ç¤¹¤ë¥â¡¼¥É¤Ë¤Ê¤ê¡¤¥½¡¼¥¹¤Î¥¤¥ó¥Ç¥ó¥È¤Ê¤É¤¬ ¤Ç¤¤ë¡¥¥³¥Þ¥ó¥É¤Ïɽ2.2¤Ë¤Þ¤È¤á¤Æ¤¢¤ë¡¥
Table 2.2: Tuareg mode ¥¡¼¥Ð¥¤¥ó¥Ç¥£¥ó¥°
TAB ¸½ºß¤Î¹Ô¤Î¥¤¥ó¥Ç¥ó¥È C-c C-p Á°¤Î¥Õ¥ì¡¼¥º(°ÕÌ£¤Î¤¢¤ë¤Þ¤È¤Þ¤ê)¤Ø°Üư C-c C-n ¼¡¤Î¥Õ¥ì¡¼¥º¤Ø°Üư ESC C-h ¥Õ¥ì¡¼¥º¤Ë¥Þ¡¼¥¯ ESC q ¥Õ¥ì¡¼¥º¤ò¥¤¥ó¥Ç¥ó¥È C-c . t try ¼°¤ÎÁÞÆþ C-c . m match ¼°¤ÎÁÞÆþ C-c . l let ¼°¤ÎÁÞÆþ C-c . i if ¼°¤ÎÁÞÆþ C-c . w while ¼°¤ÎÁÞÆþ C-c . f for ¼°¤ÎÁÞÆþ C-c . b begin ¼°¤ÎÁÞÆþ C-c C-s ocaml ¤òµ¯Æ°¡¥µ¯Æ°Ãæ¤Ë¤Ï°Ê²¼¤Î¥³¥Þ¥ó¥É¤¬»ÈÍѲÄǽ C-c C-k ocaml ¤ò½ªÎ» C-c C-b ¥Ð¥Ã¥Õ¥¡¤òɾ²Á(ocaml ¥×¥í¥»¥¹¤ØÁ÷¿®) C-c C-r ÁªÂòÉôʬ¤Îɾ²Á C-c C-e ¥Õ¥ì¡¼¥º¤Îɾ²Á
¥Õ¥¡¥¤¥ë¤Ë¥×¥í¥°¥é¥à¤ò½ñ¤¯¤È¤¤Ï¡¤¥³¥á¥ó¥È¤ò½ñ¤¯¤è¤¦¤Ë¤·¤¿¤¤¡¥ ¥×¥í¥°¥é¥àÃæ¤Î¥³¥á¥ó¥È¤Ï (* ¤È *) ¤Ç°Ï¤Þ¤ì¤¿Éôʬ¤Ç¤¢¤ë¡¥ ¤Þ¤¿¡¤¥³¥á¥ó¥È¤ÏÆþ¤ì»Ò¤Ë¤Ê¤Ã¤Æ¤â¤è¤¤¤·¡¤ÅÓÃæ¤Ë²þ¹Ô¤ò¤Ï¤µ¤ó¤Ç¤â¤è¤¤¡¥
EUC ¤Ç¥¨¥ó¥³¡¼¥É¤µ¤ì¤Æ¤¤¤ë¸Â¤ê¡¤¥³¥á¥ó¥È¡¤Ê¸»úÎóÄê¿ô¤ËÆüËܸì¤òÍѤ¤¤ë¤³ ¤È¤¬¤Ç¤¤ë(¤è¤¦¤Ç¤¢¤ë)¡¥¤·¤«¤·¡¤Ê¸»úÎóÄê¿ô¤Ë´Ø¤·¤Æ¤Ï¡¤¤½¤ÎŤµ¤Ê¤É¤¬ (¥Ð¥¤¥È¿ô¤ò¿ô¤¨¤Æ¤·¤Þ¤¤)Àµ¤·¤¯Ç§¼±¤µ¤ì¤Ê¤¤¤Î¤Ç¡¤¤Ç¤¤ì¤Ð»È¤ï¤Ê¤¤Êý¤¬Ìµ Æñ¤Ç¤¢¤í¤¦¡¥
Objective Caml ¥×¥í¥°¥é¥à¤Ï¼°(expression)¤«¤é¡¤ ¤½¤ì¤¬¼¨¤¹ÃÍ(value)(Î㤨¤Ð¡¤¼° 1 + 2 ¤ÎÃÍ¤Ï 3 ¤Ç¤¢¤ë)¤ò ·×»»¤¹¤ë¤³¤È¤Ç¥×¥í¥°¥é¥à¤Î¼Â¹Ô¤¬¿Ê¤ó¤Ç¹Ô¤¯¡¥¼°¤«¤éÃͤò ·×»»¤¹¤ë²áÄø¤òɾ²Á(evaluation)¤È¤¤¤¦¡¥ ºÇ¤â´Êñ¤Ê¼°¤Ï¡¤À°¿ô¤äʸ»úÎó¤Ê¤É¤Î¡¤´ðËÜŪ¤Ê¥Ç¡¼¥¿Äê¿ô¤Ç¤¢¤ë¡¥¤³¤ì¤é¤Ï ¤½¤ì¼«¿È¤¬ÃͤǤ¢¤ë¡¥ Ê£»¨¤Ê¼°¤Ï´Êñ¤Ê¼°¤òÁȤ߹ç¤ï¤»¤ë¤³¤È¤Ç¹½À®¤¹¤ë¡¥Î㤨¤Ð¡¤1 + 2 ¤È¤¤¤¦ ¼°¤ÏÆó¤Ä¤ÎÉôʬ¼°(subexpression) 1 ¤È 2 ¤È + ¤È¤¤¤¦ Æó¹à±é»»»Ò¤«¤é¹½À®¤µ¤ì¤Æ¤¤¤ë¡¥
ËܳÊŪ¤Ê¥×¥í¥°¥é¥ß¥ó¥°¤ËÆþ¤ëÁ°¤Ë¡¤Objective Caml ¤Ç»ÈÍѤµ¤ì¤ë´ðËÜŪ¤Ê¥Ç¡¼¥¿(À°¿ô¡¤¼Â ¿ô¡¤Ê¸»úÎó¤Ê¤É)¤È¤½¤ì¤ËÂФ¹¤ë±é»»(²Ã¸º¾è½ü¡¤Ê¸»úÎó¤Î·ë¹ç¤Ê¤É)¤ò¡¤¥Ç¡¼¥¿¤Î·¿ ¤´¤È¤ËÀâÌÀ¤·¡¤Ê£»¨¤Ê¼°¤ò¹½À®¤¹¤ëÊýË¡¤ò¤ß¤Æ¤¤¤¯¡¥
¥á¥¿ÊÑ¿ô¤Ë¤Ä¤¤¤Æ ¥Æ¥¥¹¥È Ãæ¡¤Objective Caml ¼°¤òɽµ¤¹¤ëºÝ¤Ë¡¤ i + j¤Î¤è¤¦¤Ë¡¤¼ÐÂαѾ®Ê¸»ú¤È¥¿¥¤¥×¥é¥¤¥¿ÂΤò º®¤¼¤ÆÉ½µ¤¹¤ë¤³¤È¤¬¤¢¤ë¡¥+ µ¹æ¤¬ Objective Caml ¤Î¼°¤Î°ìÉô¤Îʸ»ú¤Ç¤¢¤ë ¤³¤È¤ËÂФ·¤Æ¡¤i, j ¤Ï(¤³¤Î¥Æ¥¥¹¥È Ãæ¤Ç¤Ï) Ǥ°Õ¤ÎÀ°¿ô¼°¤òɽ¤¹¤¿¤á¤Î¥Æ¥¥¹¥È¾å¤Ç¤Îɽµ¤Ç¤¢¤ë¡¥¤¹¤ë¤È¡¤Î㤨¤Ð Objective Caml ¼° 1 + 2 ¤Ï i ¤ò 1, j ¤ò 2¤È¹Í¤¨¤¿¾ì¹ç¤ÎÎã¤È¹Í¤¨ ¤ë¤³¤È¤Ë¤Ê¤ë¡¥¤³¤Î¤è¤¦¤Ê¥×¥í¥°¥é¥à¤ÎÀ¤³¦¤Î³°¤Ç¤Îɽµ¤Î¤¿¤á¤ÎÊÑ¿ô¤ò ¥á¥¿ÊÑ¿ô(metavariable)¤È¸Æ¤Ö¡¥¥×¥í¥°¥é¥à¤ËÍѤ¤¤é¤ì¤ëÊÑ¿ô (¥×¥í¥°¥é¥àÊÑ¿ô)¤Èº®Æ±¤·¤Ê¤¤¤è¤¦¤Ëµ¤¤ò¤Ä¤±¤¿¤¤¡¥ÆÃ¤Ë¡¤¥×¥í¥°¥é¥àÊÑ¿ô ¤Î¤¿¤á¤Î¥á¥¿ÊÑ¿ô¤òÍѤ¤¤ë¾ì¹ç¤Ë¤ÏÃí°Õ¤¬É¬ÍפǤ¢¤ë¡¥Î㤨¤Ð¡¤¥Æ¥¥¹¥ÈÃæ ¤Ç x, y ¤Ê¤É¤ò¥×¥í¥°¥é¥àÊÑ¿ô¤Î¤¿¤á¤Î¥á¥¿ÊÑ¿ô¤È¤·¤Æ»ÈÍѤ¹¤ë¤¬¡¤ x + 1¤È½ñ¤¤¤¿¤È¤¤Ë¤Ï¡¤a + 1, pi + 1, hoge + 1, x + 1 ¤Ê ¤É¡¤a, pi, hoge, x ¤È¤¤¤¦¶ñÂÎŪ¤ÊÊÑ¿ô¤ò»È¤Ã¤¿Ç¤°Õ¤Î¼°¤òɽ¤ï¤· ¤Æ¤¤¤ë¡¥
unit¤Ï¡¤() (unit value ¤È¸Æ¤Ö) ¤È¤¤¤¦Ãͤò¤¿¤À¤Ò¤È¤Ä¤Î Í×ÁǤȤ·¤Æ´Þ¤à¤è¤¦¤Ê·¿¤Ç¤¢¤ë¡¥
# ();; - : unit = ()
¤³¤ÎÃͤËÂФ·¤Æ¹Ô¤¨¤ë±é»»¤Ï¤Ê¤¯¡¤Ìò¤ËΩ¤¿¤Ê¤¤¤â¤Î¤Ë»×¤¨¤ë¤«¤â¤·¤ì¤Ê¤¤¡¥ ŵ·¿Åª¤Ê»ÈÍÑË¡¤Ë¤Ï¤Õ¤¿¤Ä¤¢¤ë¡¥¤Ò¤È¤Ä¤Ï¡¤ÊÖ¤êÃͤ˰ÕÌ£¤¬¤Ê¤¤¤è¤¦¤Ê¡¤Î㤨¤Ð ¥Õ¥¡¥¤¥ë¤Ë½ñ¤¹þ¤ß¤ò¹Ô¤Ê¤¦¤À¤±¤Î¼°¤Ï¡¤unit·¿¤ò»ý¤Ä¡¥ ¤½¤Î°ÕÌ£¤Ç¡¤C ¤Ê¤É¤Ë¤ª¤±¤ë void ·¿¤È»÷¤Æ¤¤¤ë2¡¥ ¤Þ¤¿¡¤¤â¤¦¤Ò¤È¤Ä¤Ï¡¤(°ÕÌ£¤Î¤¢¤ë)°ú¿ô¤ÎÍפé¤Ê¤¤¼ê³¤¤Ï unit·¿¤Î°ú¿ô¤ò¼è¤ë´Ø¿ô¤È¤·¤ÆÉ½¤µ¤ì¤ë¡¥
¤¤¤ï¤æ¤ëÀ°¿ô¡¤…, −2, −1, 0, 1, 2, … ¤Î·¿¤Ç¤¢¤ë¡¥»»½Ñ±é»»¤È¤·¤Æ »Í§±é»» +, -, *, /, ¾ê;¤òµá¤á¤ë mod ¤Ê¤É¤¬¡¤¤Þ¤¿¡¤¥Ó¥Ã¥È±é»»¤È ¤·¤Æ¼¡¤Î¤è¤¦¤Ê¤â¤Î¤¬ÍѰդµ¤ì¤Æ¤¤¤ë¡¥
(ÉâÆ°¾®¿ôÅÀɽ¸½¤Î)¼Â¿ô¤Î·¿¤Ç¤¢¤ë¡¥3.1415 ¤Ê¤É¤Î¾®¿ôÅÀɽ¸½¤È 31.415e-1 ¤Ê¤É¤Î10¤ò´ðÄì¤È¤¹¤ë»Ø¿ôɽ¸½ (= 31.415 × 10−1) ¤¬ »ÈÍѤǤ¤ë¡¥¤Þ¤¿¡¤¾®¿ôÅÀ¤ÎÁ°¤Î0¤Ï¾Êά¤Ç¤¤Ê¤¤¡¥
Àè½Ò¤Î»Í§±é»»µ¹æ¤ÏÉâÆ°¾®¿ôÅÀ¤ËÂФ·¤ÆÍѤ¤¤ë¤³¤È¤Ï¤Ç¤¤Ê¤¤¡¥¤½¤ÎÂå¤ê¤Ë ¾®¿ôÅÀ¤ò¤Ä¤±¤¿ +., -., *., /. ¤ò»È¤¦¡¥¤Þ¤¿¡¤µÕ¤ËÀ°¿ô¤ò ¡Ö¤½¤Î¤Þ¤Þ¡×¼Â¿ô¤È¤ß¤Ê¤·¡¤+. ¤Ê¤É¤ò»È¤¦¤³¤È¤â¤Ç¤¤Ê¤¤¡¥ À°¿ô/¼Â¿ô´Ö¤ÎÊÑ´¹¤Ë¤Ï int_of_float, float_of_int ¤È¤¤¤¦´Ø¿ô¤¬ ÍѰդµ¤ì¤Æ¤¤¤ë¡¥(¤Ä¤Þ¤ê¡¤C ¸À¸ì¤Ê¤É¤Î¤è¤¦¤Ë°ÅÌۤη¿ÊÑ´¹¤Ï¸ºß¤·¤Ê¤¤¡¥)
# 2.1 +. 5.9;; - : float = 8. # 1 +. 3.4;; 1 +. 3.4;; ^ This expression has type int but is here used with type float # float_of_int(1) +. 3.4;; - : float = 4.4 # float_of_int 1 +. 3.4;; - : float = 4.4 # 1 + (int_of_float 3.4);; - : int = 4
´Ø¿ô¤Î°ú¿ô¤Î¤Þ¤ï¤ê¤Î () ¤Ï¾Êά²Äǽ¤Ç¤¢¤ë¡¥¾Êά²Äǽ¡¤¤È¤¤¤¦¤è¤ê¡¤¤½¤â ¤½¤â´Ø¿ôŬÍѤÎʸˡ¤È³ç¸Ì¤Ï´Ø·¸¤¬¤Ê¤¯¡¤³ç¸Ì¤Ï¤¢¤¯¤Þ¤Ç (1+2)*3 ¤Ç»È¤¦ ¤è¤¦¤Ë±é»»¤Î·ë¹ç¤Î¶¯¤µ¤ËµÕ¤é¤Ã¤ÆÉôʬ¼°¤ò¤Þ¤È¤á¤ë¤¿¤á¤Î¤â¤Î¤È¹Í¤¨¤¿Êý¤¬ ¤è¤¤¡¥¾å¤Î4ÈÖÌܤÎÎã¤Ç¤ï¤«¤ë¤è¤¦¤Ë¡¤´Ø¿ôŬÍÑ (float_of_int 1) ¤Ï +. ¤Ê¤É¤ÎÆó¹à±é»»»Ò¤è¤ê¤â·ë¹ç¤¬¶¯¤¤¡¥¤½¤Î¤¿¤á¡¤°ú¿ô¤¬ 1+2 ¤Î¤è¤¦¤ÊÊ£»¨ ¤Ê¼°¤Ç¤¢¤ë¾ì¹ç¤Ë¤Ï¡¤ f 1 + 2 ¤Ï (f 1)+2 ¤Î»ö¤Ê¤Î¤Ç¡¤°ú¿ô¤Ë³ç¸Ì¤ò¤Ä ¤± f(1+2) ¤È½ñ¤¯É¬Íפ¬¤¢¤ë¡¥
¼Â¿ô±é»»¤Ë´Ø¤·¤Æ¤Ï¡¤»°³Ñ´Ø¿ô sin, cos, tan, Ê¿Êýº¬ sqrt ¤Ê¤É¤âͽ¤áÍѰդµ¤ì¤Æ¤¤¤ë¡¥¾Ü¤·¤¯¤Ï¥Þ¥Ë¥å¥¢¥ë¤ò»²¾È¤Î¤³¤È¡¥
ASCII ʸ»ú¤Î·¿¤Ç¡¤Äê¿ô¤È¤·¤Æ°úÍÑÉä ' ¤Ç°Ï¤Þ¤ì¤¿Ê¸»ú¡¤¤â¤·¤¯¤Ïɽ 2.3 ¤Î¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹(\" ¤ò½ü¤¯)¡¤ ¤Þ¤¿¡¤int·¿¤È¤ÎÊÑ´¹´Ø¿ô char_of_int, int_of_char ¤¬ÍѰդµ¤ì¤Æ¤¤¤ë¡¥
# '\120';; - : char = 'x' # int_of_char 'Z';; - : int = 90
ʸ»úÎó¤Î·¿¤Ç¡¤Äê¿ô¤È¤·¤ÆÆó½Å°úÍÑÉä " ¤Ç°Ï¤Þ¤ì¤¿Ê¸»úÎ󤬻Ȥï¤ì¤ë¡¥ ʸ»úÎóÃæ¤Îʸ»ú¤Ë¤Ï¡¤ \' ¤ò½ü¤¯¡¤É½2.3 ¤Î¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹ ¤¬»ÈÍѤǤ¤ë¡¥ ¤Þ¤¿¡¤C ¤È¤Ï°Û¤Ê¤ê¡¤\000 ¤Ïʸ»úÎó¤Î½ªÃ¼¤òɽ¤µ¤Ê¤¤¡¥
s1 ^ s2 ¤ÇÆó¤Ä¤Îʸ»úÎós1, s2¤ò·ë¹ç¤·¤¿Ê¸»úÎó¤Ëɾ²Á¤µ¤ì¤ë¡¥¤Þ¤¿¡¤ s.[i] ¤Ç s ¤«¤é i ÈÖÌܤÎʸ»ú¤ò ¼è¤ê½Ð¤¹¤³¤È¤¬¤Ç¤¤ë¡¥
# "Hello," ^ " World!";;
- : string = "Hello, World!"
# ("Hello," ^ " World!").[10];;
- : char = 'l'
Table 2.3: ¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹
\\ ¥Ð¥Ã¥¯¥¹¥é¥Ã¥·¥å(\) \' °úÍÑÉä ('), ' Æâ¤Ç¤Î¤ß͸ú \" Æó½Å°úÍÑÉä ("), " Æâ¤Ç¤Î¤ß͸ú \n ²þ¹Ô \r (¹ÔƬ¤Ø¤Î)Éüµ¢ \t ¿åÊ¿¥¿¥Ö \b ¥Ð¥Ã¥¯¥¹¥Ú¡¼¥¹ \ddd ddd ¤ò10¿Ê¤ÎASCII¥³¡¼¥É¤È¤¹¤ëʸ»ú
¿¿µ¶Ãͤò¼¨¤¹·¿¤Ç¡¤ÃÍ¤Ï true (¿¿), false (µ¶)¤ÎÆó¤Ä¤Ç¤¢¤ë¡¥ ±é»»¤È¤·¤Æ¡¤
¤Þ¤¿°Ê²¼¤ÎÈæ³Ó±é»»»Ò¤¬ÍѰդµ¤ì¤Æ¤¤¤ë¡¥¤É¤Î±é»»»Ò¤â ξÊդη¿¤¬Æ±¤¸¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
# (not (1 < 2)) || (() = ());; - : bool = true # 3.2 > 5.1;; - : bool = false # 'a' >= 'Z';; - : bool = true # 2 < 4.1;; 2 < 4.1;; ^^^ This expression has type float but is here used with type int
¤Þ¤¿¡¤if-¼°: if b then e1 else e2 ¤Ç¾ò·ïʬ´ô¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤¤ë¡¥b ¤¬ true ¤Ëɾ²Á¤µ¤ì¤¿¤È¤¤Ï e1 ¤ÎÃÍ¡¤ false ¤Ç¤¢¤ì¤Ð e2 ¤ÎÃͤ¬¼°Á´ÂΤÎÃͤˤʤ롥
# (if 3 + 4 > 6 then "foo" else "bar") ^ "baz";; - : string = "foobaz"
ʬ´ô¸å¤Ëɾ²Á¤µ¤ì¤ë¼° e1, e2 ¤Î·¿¤Ï°ìÃפ·¤Æ¤¤¤ëɬ Íפ¬¤¢¤ë¡¥¤Þ¤¿¡¤if-¼°¤Î else-Àá¤Ï¾Êά²Äǽ¤Ç¤¢¤ë¤¬¡¤¤½¤Î¾ì¹ç¤Ï else () ¤¬±£¤ì¤Æ¤¤¤ë¤È¸«¤Ê¤µ¤ì¤ë¡¥(¤¹¤Ê¤ï¤Á¡¤¤½¤Î¾ì¹ç then-Àá¤Ë¤Ï unit·¿¤Î¼°¤¬Íè¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥)
Objective Caml ¤Ë¤Ï·¿(type)¤Î³µÇ°¤¬¤¢¤ê¡¤¤³¤ì¤«¤é³Ø¤ó¤Ç¤¤¤¯¤è¤¦¤Ë¸À¸ì¤ÎÂç ¤¤ÊÆÃħ¤Î¤Ò¤È¤Ä¤ò¤Ê¤·¤Æ¤¤¤ë¡¥·¿¤Ï¡¤ºÇ¤âñ½ã¤Ë¤Ï¡¤¾å¤Ç¤ß¤¿ 1 ¤Ï int·¿¤Ë °¤¹¤ë¤È¤¤¤Ã¤¿¡¤¥×¥í¥°¥é¥àÃæ¤Ç»È¤ï¤ì¤ë¥Ç¡¼¥¿¤ÎʬÎà¤Ç¤¢¤ë¡¥ ¤³¤ÎʬÎà¤Ï¡¤ true ¤Ë²Ã»»¤ò¹Ô¤¦¤Ê¤É¤Î¡¤·¿¥¨¥é¡¼(type error)¤È¸Æ¤Ð¤ì¤ë¡¤¤¢¤ë ¼ï¤Î¡Ö°ÕÌ£¤Î¤Ê¤¤¡×Áàºî¤¬¹Ô¤ï¤ì¤ë¤Î¤òËɤ°¤Î¤ËÍѤ¤¤é¤ì¤ë¡¥·¿¥·¥¹¥Æ¥à(type system)¤È¤¤¤¦ÍѸì¤Ï¡¤¥×¥í¥°¥é¥à¤«¤é·¿¥Á¥§¥Ã¥¯(typecheck)¤Ë ¤è¤ê¡¤·¿¥¨¥é¡¼¤ÎȯÀ¸¤òËɤ®¡¤°ÂÁ´¤Ë¥×¥í¥°¥é¥à¤ò¼Â¹Ô¤¹¤ë¤¿¤á¤Î»ÅÁȤߤǡ¤¸À¸ì ¤´¤È¤ËÂ礤¯°Û¤Ê¤Ã¤Æ¤¤¤ë¡¥¤½¤â¤½¤â·¿¥¨¥é¡¼¤¬¤Ê¤ó¤Ç¤¢¤ë¤«¡¤¤È¤¤¤¦¤³¤È¤â¸À¸ì ¤Ë¤è¤Ã¤Æ°ã¤Ã¤Æ¤¯¤ë¤â¤Î¤Ç¤¢¤ë¤³¤È¤ËÃí°Õ¡¥Î㤨¤Ð¡¤Â¿¤¯¤Î¸À¸ì¤Ç¤Ï0¤Ç¤Î½ü»»¤Ï ·¿¥¨¥é¡¼¤È¤Ï¸«¤Ê¤µ¤ì¤Ê¤¤¤³¤È¤¬Â¿¤¤¡¥
Lisp, Perl, Postscript ¤Ê¤É¤Î¸À¸ì¤Ç¤Ï¡¤Ê¸Ë¡¤Ë¨¤·¤¿¥×¥í¥°¥é¥à¤Ï¤½¤Î¤Þ¤Þ¼Â¹Ô ¤ò»Ï¤á¤ë¤³¤È¤¬¤Ç¤¤ë¡¥¤½¤Î¤«¤ï¤ê¼Â¹Ô»þ¤Ë¡¤²¿¤«¤ÎÁàºî¤¬¹Ô¤ï¤ì¤ëÅ٤ˡ¤¤½¤ì¤¬ ·¿¥¨¥é¡¼¤òµ¯¤¹¤«¤É¤¦¤«¤ò¥Á¥§¥Ã¥¯¤¹¤ë¡¥¤³¤Î¤è¤¦¤Ê¸À¸ì¤ò¡¤¤·¤Ð¤·¤Ð ưŪ¤Ë·¿¤Å¤±¤µ¤ì¤ë¸À¸ì(dynamically typed language) ¤È¸Æ¤Ö¡¥
¤³¤ì¤ËÂФ·¤Æ¡¤C, C++, Java ¤Ê¤É¤Î¸À¸ì¤Ï¡¤¥³¥ó¥Ñ¥¤¥é¤¬¥×¥í¥°¥é¥à¼Â¹ÔÁ°¤Ë·¿ ¥Á¥§¥Ã¥¯¤ò¹Ô¤¤¡¤¤½¤ì¤òÄ̤俤â¤Î¤Î¤ß¤¬¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤ë¡¥¤³¤Î¤è¤¦¤Ê¥×¥í¥°¥é ¥à¼Â¹ÔÁ°¤Ë·¿¥Á¥§¥Ã¥¯¤ò¹Ô¤¦¤â¤Î¤ò¡¤ÀÅŪ¤Ë·¿¤Å¤±¤µ¤ì¤ë¸À¸ì(statically typed language)¤È¸Æ¤Ö3¡¥Objective Caml ¤âÀŠŪ¤Ë·¿¤Å¤±¤µ¤ì¤ë¸À¸ì¤Ç¤¢¤ë¡¥
ÀÅŪ¤Ë·¿¤Å¤±¤µ¤ì¤ë¸À¸ì¤Ç¤â¡¤C ¤ä C++ ¤Ê¤É¤Ï·¿¥·¥¹¥Æ¥à¤¬¼å¤¯¡¤·¿¥¨¥é¡¼¤ò ´°Á´¤ËËɤ°¤³¤È¤Ï¤Ç¤¤Ê¤¤¡¥°ìÈ̤ËÀÅŪ¤Ë·¿¤Å¤±¤µ¤ì¤ë¸À¸ì¤Ë¤ª¤¤¤Æ¡¤·¿¥¨¥é¡¼¤ò µ¯¤¹Áàºî¤Î·ë²Ì¤Ï(¸À¸ì¥ì¥Ù¥ë¤Ç)̤ÄêµÁ 4 ¤Ê¤Î¤Ç¡¤C ¤Ê¤É¤Î¥×¥í¥°¥é¥à¤Ï¥¯¥é¥Ã¥·¥å¤·¤Æ ¤·¤Þ¤¦¡¥¤³¤ì¤ËÂФ·¤Æ Objective Caml ¤Ï°ìÅÙ·¿¥Á¥§¥Ã¥¯¤òÄ̤ä¿¥×¥í¥° ¥é¥à¤Ï·¿¥¨¥é¡¼¤òµ¯¤µ¤Ê¤¤À¼Á(·¿°ÂÁ´À)¤¬Êݾڤµ¤ì¤Æ¤¤¤ë¡¥ÀÅŪ¤Ë·¿¤Å¤±¤µ¤ì°ÂÁ´ À¤¬ÊݾڤǤ¤ë¸À¸ì¤ò¶¯¤¯·¿¤Å¤±¤µ¤ì¤¿(strongly typed)¸À¸ì¤È¤¤¤¦¤³ ¤È¤¬¤¢¤ë¡¥
°Ê¾å¤ò¡¤¤Þ¤È¤á¤ë¤È°Ê²¼¤Î¤è¤¦¤Ë¤Ê¤ë¡¥Æ°Åª¤Ë·¿¤Å¤±¤µ¤ì¤ë¸À¸ì¤ÏɬÁ³Åª¤Ë Á´¤Æ¤Î°ÂÁ´À¤Î¥Á¥§¥Ã¥¯¤ò¹Ô¤¨¤ë¤Î¤Ç unsafe–dynamically typed ¤ÎÍó¤¬ ¶õ¤¤¤Æ¤¤¤ë¡¥
| statically typed | dynamically typed | |
| unsafe | C, C++, etc. | — |
| safe | Java, ML, Haskell, etc. | Lisp, Scheme, Perl, PostScript, etc. |
ÀÅŪ·¿¥·¥¹¥Æ¥à¤Ï¡¤¥×¥í¥°¥é¥à¤ÎʸÌ̤À¤±¤«¤é¡¤¤Ä¤Þ¤ê·×»»Á°¤Î Ê£»¨¤Ê¼°¤ËÂФ·¤Æ·¿¤ÎÀ°¹çÀ¤òȽÄꤷ¤Ê¤±¤ì¤Ð¤Ê¤é¤º¡¤¸«ÀѤâ¤ê¤¬¤É¤¦¤·¤Æ¤â ÊݼéŪ¤Ë¤Ê¤é¤¶¤ë¤òÆÀ¤Ê¤¤¡¥Î㤨¤Ð
if ⟨ Ê£»¨¤Ê¼° ⟩ then 1 else "foo"
¤Ï¡¤⟨ Ê£»¨¤Ê¼° ⟩¤¬¾ï¤Ë true¤òÊÖ¤¹¤è¤¦¤Ê¼°¤Ç¤¢¤Ã¤¿¤È¤·¤¿¤é¡¤ else-À᤬¼Â¹Ô¤µ¤ì¤ë¤³¤È¤¬¤Ê¤¤¤Î¤Ç¡¤À°¿ô¤¬É¬ÍפÊʸ̮¤Ç»ÈÍѤ·¤Æ¤â ¼Â¹Ô»þ¤Ë¤Ï²¿¤ÎÌäÂê¤â¤Ê¤¤¡¥¤·¤«¤·¡¤·¿¥·¥¹¥Æ¥à¤Ï¾ò·ï¼°¤ÎÃͤ˴ط¸¤Ê¤¯¡¤Ê¬ ´ôÀè¤Î¼°¤Î·¿¤¬°ìÃפ¹¤ë¤³¤È¤òÍ׵᤹¤ë¡¥¤³¤Î¤¿¤á¡¤·¿¥¨¥é¡¼¤òµ¯¤µ¤º¤Ë¼Â¹Ô¤Ç¤ ¤ë¤Ï¤º¤Î¥×¥í¥°¥é¥à¤¬·¿¥Á¥§¥Ã¥¯¤òÄ̤é¤Ê¤¤²ÄǽÀ¤¬¤¢¤ë¡¥ÀÅŪ·¿ÉÕ¸À¸ì¤ÎÀß ·×¼Ô¤Ë¤È¤Ã¤Æ¤Ï°ÂÁ´¤Ê¥×¥í¥°¥é¥à¤À¤±¤ò¼õÍý¤·¤Ä¤Ä¡¤¤Ç¤¤ë¸Â¤ê¿¤¯¤Î°ÂÁ´¤Ê ¥×¥í¥°¥é¥à¤ò¼õÍý¤Ç¤¤ë¤è¤¦¤Ê·¿¥·¥¹¥Æ¥à¤òÀ߷פ¹¤ë¤Î¤¬¡¤Æ¬¤ÎǺ¤Þ¤»¤É¤³¤í ¤Ç¤¢¤ë¡¥
°ìÊý¡¤Æ°Åª¤Ë·¿¤Å¤±¤µ¤ì¤ë¸À¸ì¤ÏÁàºî¤¬¹Ô¤ï¤ì¤ëÅ٤ˡ¤¼Â¹Ô¤¬°ÂÁ´¤Ë¹Ô¤¨¤ë¤«¤É¤¦¤« ¥Á¥§¥Ã¥¯¤ò¤¹¤ë¤Î¤Ç¡¤¥Á¥§¥Ã¥¯¤ò¤Þ¤¸¤á¤Ë¤ä¤ë¸Â¤ê°ÂÁ´¤Ë¼Â¹Ô¤Ç¤¤ë¤â¤Î¤Î¡¤ ¥Á¥§¥Ã¥¯¤Î¥³¥¹¥È¤ò;·×¤Ëʧ¤¦¤³¤È¤Ë¤Ê¤ë¡¥
Á°Àá¤Ç³Ø¤ó¤À¤Î¤Ï´Êñ¤ÊÁàºî¤òÁȤ߹ç¤ï¤»¤Æ¡¤Ê£»¨¤Ê·×»»¤ò¹Ô¤¦¼°¤òÁȤßΩ¤Æ¤ëÊý Ë¡¤Ç¤¢¤ë¡¥·×»»¤·¤¿·ë²Ì¤ÎÃͤˤÏ̾Á°¤ò¤Ä¤±¤Æ¤ª¤¤¤Æ¤¢¤È¤Ç»²¾È¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡¥ ¤³¤ì¤ò¹Ô¤¦¤Î¤¬ let Àë¸À¤Ç¤¢¤ë¡¥
¤Þ¤º¤Ï¡¤let Àë¸À¤ÎÎã¤ò¤ß¤Æ¤ß¤ë¡¥
# let pi = 3.1415926535;; val pi : float = 3.1415926535
¤³¤ì¤Ï pi ¤È¤¤¤¦Ì¾Á°¤ÎÊÑ¿ô¤òÀë¸À¤·¡¤¤½¤ÎÊÑ¿ô¤ò3.1415926535 ¤È¤¤¤¦¼Â¿ô¤Ë «Çû¤·¤Æ¤¤¤ë¡¥¥³¥ó¥Ñ¥¤¥é¤Î½ÐÎϤȤ·¤Æ¡¤ÃͤÎ̾Á°¤¬Àë¸À¤µ¤ì¤¿¤³¤È¤ò¼¨¤¹ val¡¤ÊÑ¿ô̾ pi¡¤¤½¤ÎÊÑ¿ô¤¬Â«Çû¤µ¤ì ¤¿ÃÍ(¤â¤Á¤í¤ó3.1415926535)¡¤¤È¤½¤Î·¿¤¬ÆÀ¤é¤ì¤ë¡¥¤³¤ÎÃͤϡ¤°Ê¹ß¤Ç pi ¤È ¤¤¤¦Ì¾Á°¤Ç»²¾È¤¹¤ë¤³¤È¤¬¤Ç¤¡¤pi ¤È½ñ¤¯¤³¤È¤È¡¤3.1415926535 ¤È½ñ¤¯¤³¤È ¤ÏƱ¤¸¤³¤È¤ò°ÕÌ£¤¹¤ë¡¥
# pi;; - : float = 3.1415926535 # let area_circle2 = 2.0 *. 2.0 *. pi;; val area_circle2 : float = 12.566370614
°ìÈÌŪ¤Ë¤Ï
let x = e;;
¤È¤¤¤¦·Á¤Ç¡¤Àë¸À¤µ¤ì¤¿ÊÑ¿ô x ¤ò¡Ö¼° e ¤òɾ²Á¤·¤¿Ã͡פË«Çû¤¹¤ë¡¥ÊÑ¿ô¤òÀë¸À¤¹¤ë¤³¤È¤Ë¤Ï¡¤
¤È¤¤¤Ã¤¿°ÕµÁ¤¬¤¢¤ë¡¥¤Ò¤È¤Ä¤á¤Î´ÑÅÀ¤«¤é¸À¤¨¤Ð¡¤Ê¬¤«¤ê¤Ë¤¯¤¤ÊÑ¿ô̾¤ò ¤Ä¤±¤ë¤³¤È¤ÏÈò¤±¤ë¤Ù¤¤Ç¤¢¤ê¡¤¤¿¤È¤¨°ì»þŪ¤Ë¤·¤«»È¤ï¤Ê¤¤ÊÑ¿ô¤Ç¤â °ÕÌ£¤òÈ¿±Ç¤·¤¿Ì¾Á°¤ò¤Ä¤±¤ë¤Ù¤¤Ç¤¢¤ë¡¥¤Õ¤¿¤Ä¤á¤Ë´Ø¤·¤ÆÊ䤷¤Æ¤ª¤¯¤È¡¤ ÊÑ¿ô¤¬Â«Çû¤µ¤ì¤ëÂоݤϷ׻»·ë²Ì¤ÎÃͤǤ¢¤Ã¤Æ¡¤¼°¼«ÂΤǤϤʤ¤¤³¤È¤ËÃí°Õ¡¥ ¾å¤Ç¡¤¡Öpi ¤È½ñ¤¯¤³¤È¤È¡¤3.1415926535 ¤È½ñ¤¯¤³¤È¤ÏƱ¤¸¤³¤È¤ò °ÕÌ£¤¹¤ë¡×¤È¤¤¤Ã¤¿¤Î¤Ï¼°¼«ÂΤ¬ÃͤˤʤäƤ¤¤ë¤«¤é¤Ç¤¢¤ë¡¥¤¿¤À¡¤ºÆÅÙ·×»» ¤¹¤ë¤³¤È¤Î̵Â̤ò½ü¤±¤Ð¡¤(¥Ç¥£¥¹¥×¥ì¥¤½ÐÎϤʤɤÎÉûºîÍѤ¬¤Ê¤¤¸Â¤ê) ¼°¤È¤½¤ÎÃͤϷ׻»·ë²Ì¤Ë±Æ¶Á¤ò¤ª¤è¤Ü¤µ¤Ê¤¤¡¥
Objective Caml ¤Ë¤ª¤±¤ëÊÑ¿ôÀë¸À¤ÏÃͤË̾Á°¤ò¤Ä¤±¤ë¤â¤Î¤Ç¡¤C, C++ ¤Î¤è¤¦¤Ë¡¤ ¥á¥â¥êÎΰè¤Ë̾Á°¤ò¤Ä¤±¤ë¤â¤Î¤Ç¤Ï¤Ê¤¯¡¤ÂåÆþʸ¤Î¤è¤¦¤Ê¤â¤Î¤Ç¡ÖÃæ¿È¤ò¹¹¿·¤¹¤ë¡× ¤³¤È¤Ï¤Ç¤¤Ê¤¤¡¥¤¿¤À¤·Æ±¤¸Ì¾Á°¤ÎÊÑ¿ô¤òºÆÀë¸À¤¹¤ë¤³¤È¤Ï¤Ç¤¤ë¡¥
# let one = 1;; val one : int = 1 # let two = one + one;; val two : int = 2 # let one = "One";; val one : string = "One" # let three = one ^ one ^ one;; val three : string = "OneOneOne"
¤³¤Î¾ì¹ç¡¤one ¤ÎÃÍ¤Ï 1 ¤«¤é "One" ¤Ë¹¹¿·¤µ¤ì¤¿¤ï¤±¤Ç¤Ï¤Ê¤¯¡¤ Ʊ¤¸Ì¾Á°¤ÎÊÑ¿ôÀë¸À¤Ë¤è¤êÁ°¤ÎÀë¸À¤¬±£¤µ¤ì¤Æ¸«¤¨¤Ê¤¯¤Ê¤Ã¤¿¤À¤±¤Ê¤Î¤Ç¤¢¤ë¡¥ (¤½¤â¤½¤âÂåÆþ¤À¤È¹Í¤¨¤ë¤È¡¤Á°¤ÎÀë¸À¤È±¦Êդη¿¤¬°ìÃפ·¤Æ¤¤¤Ê¤¤¤Î¤ÇÊѤǤ¢¤ë¡¥)
Àë¸À¤µ¤ì¤¿ÊÑ¿ô¤Ï¾ï¤Ë͸úÈϰÏ(scope)¤È¤¤¤Ã¤Æ¡¤¤½¤ÎÊÑ¿ô¤ò»È¤Ã¤Æ ¤è¤¤¥×¥í¥°¥é¥àʸÌ̾å¤ÎÈϰϤ¬³äÅö¤Æ¤é¤ì¤ë¡¥Î㤨¤Ð¡¤letÀë¸À¤Î͸úÈϰÏ(scope)¤ÏÀë¸À°Ê¹ß¡¤¥Õ¥¡¥¤¥ë(ocaml¥»¥Ã¥·¥ç¥ó)½ªÎ»¤Þ¤Ç¤Ç¤¢¤ë¡¥ ÊÑ¿ô¤Î¤Ò¤È¤Ä¤Ò¤È¤Ä¤Î»ÈÍÑ(Àë¸À¤È¶èÊ̤·¤ÆÊÑ¿ô»²¾È(variable reference)¤È¤â¸À¤¦)¤ËÂФ·¤Æ¡¤(°ÊÁ°¤ËÀë¸À¤µ¤ì¤Æ¤¤¤ëʪ¤Ç)ºÇ¤â¶á¤¤¤â¤Î ¤¬Âбþ¤¹¤ë¡¥¤³¤ÎÂбþ´Ø·¸¤Ï¡¤¼Â¹Ô»þ¤Ç¤Ï¤Ê¤¯¥×¥í¥°¥é¥à¤¬½ñ¤«¤«¤ì¤¿(¤â¤·¤¯¤Ï ¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿)»þÅÀ¤Ç·èÄꤵ¤ì¤ë¤Î¤Ç¡¤¡Ö¤³¤Î¸À¸ì¤Ç¤ÎÊÑ¿ôÀë¸À¤Ï ÀÅŪ͸úÈϰÏ(static scope¡¤ lexical scope)¤ò»ý¤Ä¡×¤È¸À¤ï¤ì¤ë¡¥
¤È¤³¤í¤Ç¡¤Objective Caml ¤Ç¤ÏÊÑ¿ô¤Î·¿¤Ï¥³¥ó¥Ñ¥¤¥é¤¬¼«Æ°Åª¤Ë¿äÏÀ¤·¤Æ¤¯¤ì¤ë¤¿ ¤á¡¤Àë¸À¤¹¤ëɬÍפ¬¤Ê¤¤¡¥¤¿¤À¡¤¥×¥í¥°¥é¥à¤Î°ÕÌ£¤ò¤ï¤«¤ê¤ä¤¹¤¯¤¹¤ë¤¿¤á¡¤ ¥Ç¥Ð¥Ã¥°¤Î¤¿¤á¡¤ÊÑ¿ô¤Î·¿¤òÌÀ¼¨Åª¤Ë¼¨¤·¤Æ¤ª¤¤¿¤¤¤È¤¤Ï¡¤ÊÑ¿ô̾¤Î¸å¤Ë “: ⟨ ·¿ ⟩” ¤È¤·¤ÆÀë¸À¤¹¤ë¤³¤È¤â¤Ç¤¤ë¡¥¤Þ¤¿¡¤Ê£¿ô¤Îlet-Àë ¸À¤Ï¤½¤Î¶Ìܤ¬¤Ï¤Ã¤¤ê¤·¤Æ¤¤¤ë(¼¡¤Î let ¤¬Íè¤ëľÁ°¤ÇÀÚ¤ì¤ë)¤Î¤Ç´Ö¤Ë ;; ¤ò¤Ä¤±¤º¤Ëʤ٤뤳¤È¤¬¤Ç¤¤ë¡¥
# let pi : float = 3.1415926535 let e = 2.718281828;; val pi : float = 3.1415926535 val e : float = 2.718281828
Æó¤Ä¤ÎÀë¸À¤¬¤Þ¤È¤á¤Æ¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤Æ·ë²Ì¤¬¤Þ¤È¤Þ¤Ã¤Æ½ÐÎϤµ¤ì¤Æ¤¤¤ë¤³¤È¤ËÃíÌÜ¡¥
ÊÑ¿ô¤Î̾Á°¤È¤·¤ÆÍѤ¤¤ë¤³¤È¤¬¤Ç¤¤ë¤Î¤Ï¡¤
¤Ç¤¢¤ë¤è¤¦¤ÊǤ°Õ¤ÎŤµ¤Îʸ»úÎó¤Ç¡¤É½2.4¤Î Objective Caml ¤Îʸˡ¥¡¼¥ï¡¼ ¥É¤È _ °ìʸ»ú¤Î¤ß¤«¤é¤Ê¤ë¤â¤Î¤ò½ü¤¯¤â¤Î¤Ç¤¢¤ë¡¥
¤³¤³¤Ç¹â¥ì¥Ù¥ë¤Ê¼°¤Î°ÕÌ£¤òÎ¥¤ì¤Æ¡¤Ì¾Á°»²¾È¤¬¤É¤Î¤è¤¦¤Ë¼Â¸½¤µ¤ì¤Æ¤¤¤ë¤«¤ò¤ß ¤Æ¤ß¤ë¡¥¥×¥í¥°¥é¥à¤Î¼Â¹ÔÃæ¤Ë¤Ï¡¤¼Â¹Ô¤·¤Æ¤¤¤ë»þÅÀ¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë(͸úÈÏ°Ï¤Ë ¤¢¤ë)ÊÑ¿ô̾¤È¤½¤ÎÃͤÎÁȤΥꥹ¥È¤¬¥á¥â¥ê¾å¤ËÊݸ¤µ¤ì¤Æ¤¤¤ë¡¥¤³¤Î¥Ç¡¼¥¿¤Î¤³¤È ¤ò´Ä¶(environment)¤È¤¤¤¦¡¥ÆÃ¤Ë¡¤¥×¥í¥°¥é¥à¤Î°ìÈÖ³°Â¦¤Ë¤ª¤±¤ë´Ä¶ ¤ò¥È¥Ã¥×¥ì¥Ù¥ë´Ä¶(top-level environment)¡¤¤Þ¤¿¤ÏÂç°è´Ä ¶(global environment)¤È¤¤¤¦¡¥
Î㤨¤Ð¡¤ocaml ¤òµ¯Æ°¤·¤¿¤È¤¤Ë¤Ï¡¤sin, max_int ¤Ê¤É¤Î̾Á°¤¬Âç°è´Ä¶¤Ë ¤¢¤ë¾õÂ֤ǥ»¥Ã¥·¥ç¥ó¤¬»Ï¤Þ¤ë(¿Þ2.1)¡¥
letÀë¸À¤ò¼Â¹Ô¤¹¤ëºÝ¤Ë¤Ï¡¤¤³¤Î¥È¥Ã¥×¥ì¥Ù¥ë´Ä¶¤ÎºÇ¸å¤Ë¡¤¿·¤·¤¤ÊÑ¿ô ¤È¤½¤ÎÃͤÎÁȤ¬Äɲ䵤ì¤ë(¿Þ2.2) ¡¥ÊÑ¿ô¤Î»²¾È¤Ï¡¤¤³¤Î´Ä¶¤ò²¼¤«¤é ½çÈÖ¤ËÊÑ¿ô¤òõ¤·¤Æ¹Ô¤¯Áàºî¤ËÂбþ¤¹¤ë5¡¥¤½¤Î¤¿¤á¡¤Æ±¤¸Ì¾Á°¤ÎÊÑ¿ô¤¬ºÆÄêµÁ¤µ¤ì ¤¿¾ì¹ç¡¤¾å¤Î¥¨¥ó¥È¥ê¤Ëõº÷¤¬Åþ㤷¤Ê¤¤¤¿¤á¤Ë»²¾È¤¹¤ë¤³¤È¤¬¤Ç¤¤Ê¤¯¤Ê¤ë¡¥ Âç°è´Ä¶¤«¤é¥¨¥ó¥È¥ê¤¬ºï½ü¤µ¤ì¤ë¤³¤È¤Ï¤Ê¤¤¡¥ ¤½¤Î¤¿¤áletÀë¸À¤Î͸úÈϰϤÏÀë¸Àľ¸å¤«¤é¥×¥í¥°¥é¥à½ªÎ»¤Þ¤Ç¤Ê¤Î¤Ç¤¢¤ë¡¥
| a_2' ____ Cat _'_'_ 7eleven 'ab2_ _ |
¿¤¯¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤Ï¡¤·×»»¼ê½ç¤Ë̾Á°¤ò¤Ä¤±¤ÆÃê¾Ý²½¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡¥ Objective Caml ¤Ç¤Ï¤³¤ì¤ò´Ø¿ô(function)¤È¸Æ¤Ö¡¥
¾å¤ÇÄêµÁ¤·¤¿ÊÑ¿ô pi ¤ò»È¤Ã¤Æ¡¤±ß¤ÎÌÌÀѤòµá¤á¤ë¤³¤È¤ò¹Í¤¨¤ë¡¥±ß¤ÎÌÌÀÑ ¼«ÂΤϤâ¤Á¤í¤ó¡¤
⟨Ⱦ·Â⟩ *. ⟨Ⱦ·Â⟩ *. pi
¤È¤¤¤¦¼°¤Çµá¤Þ¤ë¤ï¤±¤À¤¬¡¤°ã¤Ã¤¿È¾·Â¤ËÂФ·¤Æ¡ÖƱ¤¸¤è¤¦¤Ê¼°¡×¤ò ²¿ÅÙ¤âÆþÎϤ¹¤ë¤Î¤Ï¡¤´Ö°ã¤¤¤Î¤â¤È¤Ç¤¢¤ê¡¤¤Þ¤¿¡¤¤½¤Î¼°¤¬²¿¤ò°ÕÌ£¤¹¤ë¤Î¤«¤¬ ¤ï¤«¤ê¤Ë¤¯¤¯¤Ê¤ë¡¥¤½¤³¤Ç¡¤¡Ö»÷¤¿¤è¤¦¤Ê·×»»¤Î¼ê½ç¡×¤Ë̾Á°¤ò¤Ä¤±¡¤ ½Ð¸½¸Ä½ê¤Ë¤è¤Ã¤Æ°ã¤¦Éôʬ(¼ÂºÝ¤ÎȾ·Â)¤Ï¡¤¥Ñ¥é¥á¡¼¥¿²½(parameterization) ¤¹¤ë¤³¤È¤ò¹Í¤¨¤ë¡¥¤³¤Î¡Ö¥Ñ¥é¥á¡¼¥¿²½¤µ¤ì¤¿·×»»¼ê½ç¡×¤¬´Ø ¿ô¤Ç¤¢¤ë¡¥
Objective Caml ¤Ç¤Ï±ß¤ÎÌÌÀѤòµá¤á¤ë´Ø¿ô¤Ï¼¡¤Î¤è¤¦¤ËÄêµÁ¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡¥
# let circle_area r = (* area of circle with radius r *)
r *. r *. pi;;
val circle_area : float -> float = <fun>
´Ø¿ôÀë¸À¤Ë¤â let Àë¸À¤ò»ÈÍѤ¹¤ë¡¥ÆþÎϤΠcircle_area ¤¬Àë¸À¤µ¤ì¤¿´Ø ¿ô¤Î̾Á°¤Ç¤¢¤ë¡¥´Ø¿ô̾¤Î¸å¤Î r ¤¬¥Ñ¥é¥á¡¼¥¿¤Ç¤¢¤ê¡¤ÄêµÁÆâ¤ÇÄ̾ï¤ÎÊÑ ¿ô¤ÈƱ¤¸¤è¤¦¤Ë»ÈÍѤ¹¤ë¤³¤È¤¬¤Ç¤¤ë¡¥= ¤è¤ê¤¢¤È¤Î¼° r *. r *. pi ¤¬ ´Ø¿ô¤ÎËÜÂÎ(body)¤È¸Æ¤Ð¤ì¤ëÉôʬ¤Ç·×»»¼ê½ç¤Ç¤¢¤ë¤È¤³¤í¤Î¼°¤ò½ñ ¤¯¤È¤³¤í¤Ç¤¢¤ë¡¥(;; ¤Ï¤¤¤Ä¤â¤Î¤è¤¦¤Ë¥³¥ó¥Ñ¥¤¥é¤ËÆþÎϽªÎ»¤òÃΤ餻¤ë¤â ¤Î¤Ç¤¢¤ë¡¥)¥³¥ó¥Ñ¥¤¥é¤«¤é¤Î±þÅú¤Ï¡¤Àë¸À¤µ¤ì¤¿Ì¾Á° circle_area¡¤¤½¤Î ·¿ float->float¡¤¤½¤ÎÃÍ <fun> ¤Èʤó¤Ç¤¤¤ë¡¥·¿¤ÎÃæ¤Î -> ¤Ï¡¤ ⟨ ¥Ñ¥é¥á¡¼¥¿¤Î·¿ ⟩->⟨ ·ë²Ì¤Î·¿ ⟩ ¤È¤¤¤¦·Á¤Ç¡¤¤½¤Î circle_area ¤¬´Ø¿ô¤Ç¤¢¤ë¤³¤È¤ò°ÕÌ£¤·¤Æ¤ª¤ê¡¤¤³¤³¤Ç¤Ï¼Â¿ô¤ò¤È¤Ã¤Æ¼Â¿ô ¤òÊÖ¤¹¤³¤È¤òɽ¤·¤Æ¤¤¤ë¡¥-> ¤Î¤è¤¦¤Ë¤è¤êñ½ã¤Ê·¿¤«¤é·¿¤ò¹½À®¤¹¤ëµ¹æ ¤ò·¿¹½ÃÛ»Ò(type constructor)¤È¸Æ¤Ö¡¥´ðËÜ·¿¤â0¸Ä¤Î·¿¤«¤é·¿¤ò ºî¤ë·¿¹½ÃۻҤȹͤ¨¤é¤ì¤ë¡¥<fun> ¤Ï¡¤¤Ê¤ó¤é¤«¤Î´Ø¿ô¤Ç¤¢¤ë¤³¤È¤ò¼¨¤·¤Æ ¤¤¤ë¡¥º£¤Þ¤Ç¸«¤Æ¤¤¿À°¿ô¤Ê¤É¤È¤Ï°Û¤Ê¤ê¡¤¥Ç¥£¥¹¥×¥ì¥¤¤Ëɽ¼¨¤Ç¤¤ëɽ¸½ (“3” ¤Ê¤É)¤ò»ý¤¿¤Ê¤¤¡¥
Àë¸À¤µ¤ì¤¿´Ø¿ô¤Ï¡¤ÁȤ߹þ¤ß¤Î int_of_float ¤Ê¤É¤ÈƱ¤¸¤è¤¦¤Ë¸Æ¤Ó½Ð¤¹¤³¤È¤¬ ¤Ç¤¤ë¡¥
# circle_area 2.0;; - : float = 12.566370614
´Ø¿ô¸Æ¤Ó½Ð¤·(´Ø¿ôŬÍÑ(function application)¤È¤â¤¤¤¦)¤Ï¡¤ ºÇ¤âÁÇËѤʸ«Êý¤Ç¤Ï¡¤´Ø¿ôËÜÂÎÃæ¤Î¥Ñ¥é¥á¡¼¥¿ r ¤ò°ú¿ô 2.0 ¤Ë ÃÖ¤´¹¤¨¤¿¼°¡¤2.0 *. 2.0 *. pi ¤òɾ²Á¤·¡¤¤½¤ÎÃͤ¬¡¤¸Æ¤Ó½Ð¤·¼° Á´ÂΤÎÃͤȤʤ롥
Objective Caml ¤Ç¤Ï¡¤ÃͤΫÇû¤ÈƱÍÍ¡¤Àë¸À¤µ¤ì¤ë´Ø¿ô¤Î¥Ñ¥é¥á¡¼¥¿¤ª¤è¤Ó·ë²Ì¤Î ·¿¤òÌÀ¼¨Åª¤ËÀë¸À¤¹¤ëɬÍפ¬¤Ê¤¤¡¥¤³¤ì¤Ï¡¤¥³¥ó¥Ñ¥¤¥é¤¬·¿¿äÏÀ(type inference)¤ò¹Ô¤Ã¤Æ¡¤¾å¤ÎÎã¤Î¤è¤¦¤Ë·¿¾ðÊó¤òÊä¤Ã¤Æ¤¯¤ì¤ë¤¿¤á¤Ç¤¢¤ë¡¥ ´Êñ¤Ê·¿¿äÏÀ¤Î»ÅÁȤߤˤĤ¤¤Æ¤Ï¡¤¸åÄø¸«¤Æ¤¤¤¯¤³¤È¤Ë¤¹¤ë¡¥¤½¤ì¤Ç¤âÌÀ¼¨Åª ¤Ë·¿¤òÀë¸À¤·¤¿¤¤¾ì¹ç¤Ë¤Ï¡¤ÃͤΫÇû¤ÈƱÍÍ¡¤·¿¾ðÊó¤òÊ䤦¤³¤È¤¬¤Ç¤¤ë¡¥
# let circle_area(r : float) : float = (* area of circle with radius r *)
r *. r *. pi;;
val circle_area : float -> float = <fun>
·ë²Ì¤Î·¿¤Ï = ¤ÎÁ°¤Ëµ½Ò¤¹¤ë¡¥¤Þ¤¿¡¤ ¥Ñ¥é¥á¡¼¥¿¤ò°Ï¤à () ¤¬É¬Íפˤʤ롥 (·¿Àë¸À¤ò¤·¤Ê¤¤¾ì¹ç¤Ç¤â () ¤ò¤Ä¤±¤ë¤³¤È¤¬¤Ç¤¤ë¤¬¡¤¸Æ¤Ó½Ð¤·¤Î»þ¤Î¾Êά¤ò¹Ô ¤¦¤Î¤ÈƱÍͤÊÍýͳ¤Ç () ¤Ï¾Êά¤¹¤ë¤³¤È¤¬Â¿¤¤¡¥)
¤³¤³¤Ç¤Î¡¤´Ø¿ôÀë¸À¤Îʸˡ¤ò¤Þ¤È¤á¤ë¤È¡¤
let f ⟨ parameter ⟩ [: t] = e
¤¿¤À¤· ⟨ parameter ⟩ ::= x | (x: t)
¤È¤Ê¤ë6¡¥ [ ] Éôʬ¤Ï¥ª¥×¥·¥ç¥ó¤Ç¤¢¤ë¡¥f ¤Ï´Ø¿ô̾¤òɽ¤¹¥á¥¿ÊÑ¿ô¡¤ t ¤Ï·¿¤òɽ¤¹¥á¥¿ÊÑ¿ô¤Ç¤¢¤ë¡¥ ´Ø¿ô̾¡¦¥Ñ¥é¥á¡¼¥¿Ì¾¤È¤·¤Æµö¤µ¤ì¤ë̾Á°¤ÏÊÑ¿ô¤Î¾ì¹ç¤ÈƱ¤¸¤Ç¤¢¤ë¡¥ (¼Â¤Ï¡¤ÊÑ¿ô̾¡¤´Ø¿ô̾¡¤¥Ñ¥é¥á¡¼¥¿Ì¾¤ò¶èÊ̤¹¤ëɬÍפϤʤ¤¡¥) ÃͤÎ̾Á°¤ÈƱ¤¸¤è¤¦¤Ë¡¤´Ø¿ô̾¡¦¥Ñ¥é¥á¡¼¥¿Ì¾¤â¤ï¤«¤ê¤ä¤¹¤¤¤â¤Î¤ò¤Ä¤±¡¤ ´Ø¿ô¤¬²¿¤ò·×»»¤¹¤ë¤Î¤«¡¤¥³¥á¥ó¥È¤ò½ñ¤¯Êʤò¤Ä¤±¤¿¤¤¡¥
ÀÅŪ͸úÈϰϤˤĤ¤¤ÆÊä ´Ø¿ôËÜÂÎÃæ¤Î pi ¤Ï¡¤ÀÅŪ͸úÈϰϤˤè¤Ã¤Æ¡¤´Ø¿ôÀë¸À¤Î»þÅÀ¤ÇÀë¸À¤µ ¤ì¤Æ¤¤¤ë¤â¤Î¤¬»²¾È¤µ¤ì¤ë¡¥¤½¤Î¤¿¤á¡¤circle_area ¤Î¤¢¤È¤Çpi ¤òºÆÀë ¸À¤·¤Æ¤â¡¤circle_area ¤ÎÄêµÁ¤Ë¤Ï±Æ¶Á¤¬¤Ê¤¤¡¥# let pi = 1.0;; val pi : float = 1. # circle_area 2.0;; - : float = 12.566370614¤³¤ì¤ËÂФ·¤Æ¡¤´Ø¿ô¤ò¸Æ¤Ó½Ð¤·¤¿»þÅÀ¤Î pi ¤ÎÃͤò¸«¤ë dynamic scoping ¤È¤¤¤¦ Êý¼°¤òºÎÍѤ·¤Æ¤¤¤ë¸À¸ì(Î㤨¤Ð Emacs Lisp)¤â¤¢¤ë¡¥dynamic scoping ¤Î²¼¤Ç¤Ï¡¤ ¾å¤Î·ë²Ì¤Ï¡¤4.0 (¤Ä¤Þ¤ê 2.0 *. 2.0 *. 1.0) ¤Ë¤Ê¤ë¡¥
Á°²ó¡¤Èó¾ï¤Ë´Êñ¤Ê´Ø¿ô¤ÎÀë¸ÀÊýË¡¤ò³Ø¤ó¤À¤¬¡¤ËÜÅö¤Ë´Êñ¤Ê¤³¤È¤·¤« ¼Â¸½¤Ç¤¤Ê¤¤¤³¤È¤Ëµ¤¤Å¤¯¤À¤í¤¦¡¥Î㤨¤Ð¡¤Ê£¿ô¤Î¥Ñ¥é¥á¡¼¥¿¤ò»ý¤Ä¤è¤¦¤Ê ´Ø¿ô¤Ï¤É¤Î¤è¤¦¤Ë¤¹¤ì¤Ð¤è¤¤¤Î¤À¤í¤¦¤«¡¥¤Þ¤¿¡¤´Ø¿ôËÜÂΤμ°¤¬Ê£»¨¤Ë¤Ê¤ë¤Ë¤Ä¤ì¡¤ ¤½¤Î°ÕÌ£¤òÄɤ¦¤Î¤¬ÂçÊѤˤʤäƤ¯¤ë¤³¤È¤Ëµ¤¤Å¤¯¤«¤â¤·¤ì¤Ê¤¤¡¥
º£²ó¤Î¼ç¤ÊÆâÍÆ¤Ï¡¤ºÆµ¢Åª¤Ê´Ø¿ôÄêµÁ¤Ç¤¢¤ë¤¬¡¤ ¤½¤ÎÁ°¤Ë¾¯¤·´ó¤êÆ»¤ò¤·¤Æ¡¤·×»»Ãæ¤Ë°ì»þŪ¤Ë»ÈÍѤ¹¤ëÊÑ¿ô¤Ç¤¢¤ë¶É½êÊÑ¿ô(local variable)¤ÎÀë¸À¤È¡¤Ê£¿ô¤ÎÃͤò¤Þ¤È¤á¤Æ°·¤¦¤¿¤á¤Î¥Ç¡¼¥¿ ¹½Â¤¤Ç¤¢¤ëÁÈ(tuple)¤ò¤ß¤Æ¤¤¤¯¡¥
´Ø¿ô¤ÎËÜÂÎÆâ¤Ç¡¤·×»»¤¬¿ô¥¹¥Æ¥Ã¥×¤ËµÚ¤Ó¼°¤¬Ê£»¨¤Ë¤Ê¤Ã¤Æ¤¯¤ë¤È Éôʬ¼°¤Î°ÕÌ£¤òÊá¤é¤¨¤ë¤³¤È¤¬½ù¡¹¤Ëº¤Æñ¤Ë¤Ê¤Ã¤Æ¤¯¤ë¡¥
Objective Caml¤Ç¤Ïlet¼°(Àë¸À¤Ç¤Ï¤Ê¤¤)¤Ë¤è¤Ã¤Æ¡¤¶É½êÊÑ¿ô¤òÀë¸À¤·¡¤ Ãͤ˰ì»þŪ¤Ê̾Á°¤ò¤Ä¤±¤ë¤³¤È¤¬¤Ç¤¤ë¡¥
¤Þ¤º¤Ï¡¤´Êñ¤ÊÎ㤫¤é¸«¤Æ¤¤¤³¤¦¡¥
# let vol_cone = (* Ⱦ·Â 2 ¹â¤µ 5 ¤Î±ß¿í¤ÎÂÎÀÑ *)
let base = pi *. 2.0 *. 2.0 in
base *. 5.0 /. 3.0;;
val vol_cone : float = 20.9439510233333337
“let base = ” °Ê²¼¤¬ let ¼°¤Ç¤¢¤ë¡¥base ¤È¤¤¤¦¶É½êÊÑ¿ô¤òÀë¸À¡¤ ÄìÌ̤ÎÌÌÀѤË«Çû¤·¤¿¤¢¤È¤Ç¡¤ÂÎÀѤò·×»»¤·¤Æ¤¤¤ë¡¥(¤½¤Î·ë²Ì¤Ï vol_cone ¤Ë¤Ê¤ë¡¥)
°ìÈÌŪ¤Ê let¼°¤Î·Á¤Ï
let x = e1 in e2
¤Ç¡¤e1, e2 ¤¬ let ¼°¤Ç¤¢¤Ã¤Æ¤â¤â¤Á¤í¤ó¤è¤¤¡¥ ¤³¤Î¼°¤Ï¡¤
¤È¤¤¤¦¼ê½ç¤ÇÃͤ¬µá¤Þ¤ë¡¥ ÊÑ¿ô x ¤Î͸úÈÏ°Ï¤Ï e2 ¤Ç¤¢¤ë¡¥ ¤è¤Ã¤Æ vol_cone ¤ÎÀë¸À°Ê¹ß¤Ç¤Ï base ¤Ï»²¾È¤Ç¤¤Ê¤¤¡¥
# base;; base;; ^^^^ Unbound value base
¤Þ¤¿¡¤e1 ¤Ïx¤Î͸úÈϰϤ˴ޤޤì¤Ê¤¤¡¥
¤â¤Á¤í¤ó¡¤let¼°¤Ï´Ø¿ô¤ÎËÜÂΤËÍѤ¤¤ë¤³¤È¤â¤Ç¤¤ë¡¥¤Þ¤¿¡¤let¼°¤Ç ¶É½êŪ¤Ë»È¤¦Êä½õŪ¤Ê´Ø¿ô¤òÀë¸À¤¹¤ë¤³¤È¤â¤Ç¤¤ë¡¥3ÈÖÌܤÎÎã¤Ï¡¤¤½¤Î(¤ä¤ä¿Í¹© Ū¤Ê)Îã¤Ç¤¢¤ë¡¥
# let cone_of_heightTwo r =
let base = r *. r *. pi in
base *. 2.0 /. 3.0;;
val cone_of_heightTwo : float -> float = <fun>
# let f x = (* f(x) = x^3 + (x^3 + 1) *)
let x3 = x * x * x in
let x3_1 = x3 + 1 in
x3 + x3_1;;
val f : int -> int = <fun>
# let g x = (* g(x) = x^3 + (x+1)^3 *)
let power3 x = x * x * x in
(power3 x) + (power3 (x + 1));;
val g : int -> int = <fun>
let¼°¤Î¤â¤Ã¤È¤âÁÇËѤʰյÁ¤Ï¡¤Éôʬ¼°¤Ë̾Á°¤ò¤Ä¤±¤ë¤³¤È¤Ë¤è¤ëÃê¾Ý²½¤Î ¼êÃʤòÄ󶡤¹¤ë¤³¤È¤Ç¤¢¤ë¡¥¤Þ¤¿Æó¼¡Åª¤Ç¤Ï¤¢¤ë¤¬¡¤Æ±¤¸Éôʬ¼°¤¬ Ê£¿ô²ó½Ð¸½¤¹¤ë¾ì¹ç¤Ë¤½¤Îɾ²Á¤ò1Å٤Ǥ¹¤Þ¤»¤é¤ì¤ë¡¤¤È¤¤¤Ã¤¿¸ú²Ì¤¬ÆÀ¤é¤ì¤ë¡¥ ¤Þ¤¿¡¤Éôʬ¼°¤Î·×»»ÊýË¡¤¬»÷¤Æ¤¤¤ë¾ì¹ç¤Ë¤Ï¡¤¥Ñ¥é¥á¡¼¥¿Ãê¾Ý¤ò»È¤Ã¤Æ¡¤ ¶É½ê´Ø¿ô¤òÄêµÁ¤¹¤ë¤³¤È¤Ç¡¤¥×¥í¥°¥é¥à¤Î¸«Ä̤·¤¬¤è¤¯¤Ê¤ë¡¥
let Àë¸À/¼°¤È¤â¤Ë¡¤and ¥¡¼¥ï¡¼¥É¤ò»È¤Ã¤Æ¡¤ Ê£¿ô¤ÎÊÑ¿ô¤òƱ»þ¤ËÀë¸À¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡¥
# let x = 2 and y = 1;;
val x : int = 2
val y : int = 1
# (* swap x and y;
the use of x is bound to the previous declaration! *)
let x = y and y = x;;
val x : int = 1
val y : int = 2
# let z =
let x = "foo"
and y = 3.1 in
x ^ (string_of_float y);;
val z : string = "foo3.1"
³ÆÊÑ¿ô¤Î»ÈÍѤ¬¤É¤³¤ÎÀë¸À¤ò»²¾È¤·¤Æ¤¤¤ë¤«¤ËÃíÌÜ¡¥
Âç°èÊÑ¿ô¤òÀë¸À¤¹¤ëletÀë¸À¤Ï¡¤Âç°è´Ä¶¤ÎËöÈø¤ËÊÑ¿ô¤Î«Çû¤òɽ¤¹¥Ú¥¢ ¤òÄɲ䷤Ƥ¤¤¯¤â¤Î¤Ç¤¢¤Ã¤¿¡¥ ¤³¤ì¤ËÂФ·¡¤let x = e1 in e2 ¤Î¾ì¹ç¡¤x¤Î¥¨¥ó¥È¥ê¤¬Äɲ䵤ì¤ë ¤Î¤Ïe2¤Îɾ²Á¤ò¤¹¤ë°ì»þŪ¤Ê´Ö¤À¤±¤Ç¤¢¤ë¡¥¤³¤ÎÄɲ䵤ì¤ë´ü´Ö ¤¬¡¤Í¸úÈϰϤËÂбþ¤·¤Æ¤¤¤ë¡¥
¤Þ¤¿´Ø¿ô¸Æ½Ð¤·¤Î¼Â¹Ô¤â¤³¤ì¤È»÷¤Æ¤¤¤Æ¡¤¥Ñ¥é¥á¡¼¥¿¤ò¼Â°ú¿ô¤Ë «Çû¤·¤ÆËÜÂΤμ¹Ԥò¹Ô¤¦¡¥¤¿¤À¤·¡¤Í¸úÈϰϤÏÀÅŪ¤Ë·è¤Þ¤ë¤¿¤á¡¤ ´Ø¿ô¤¬ÄêµÁ¤µ¤ì¤¿»þÅÀ¤Ç¤Î´Ä¶¤òÍѤ¤¤ÆËÜÂΤòɾ²Á¤¹¤ë¡¥
let pi = 3.1415926535;; let c_area(r) = r *. r *. pi;; let pi = 1;; let area = c_area 2.0;;
¤Î let area = c_area 2.0 ¤Î¼Â¹ÔÃæ¤Î´Ä¶¤Ï¡¤¿Þ3.2¤Î ¤è¤¦¤Ëɽ¤µ¤ì¤ë¡¥´Ø¿ôËÜÂÎɾ²ÁÃæ¤Î´Ä¶¤ËÃí°Õ¤¹¤ë¤³¤È¡¥
¼¡¤Ë¡¤Ê£¿ô¤ÎÃͤò¤Þ¤È¤á¤Æ°·¤¦ÊýË¡¤ò¸«¤ë¤³¤È¤Ë¤¹¤ë¡¥¤³¤ì¤Ë¤è¤Ã¤Æ Ê£¿ô¤Î¥Ñ¥é¥á¡¼¥¿¤ò¼è¤ë´Ø¿ô¡¤Ê£¿ô¤Î·ë²Ì¤òÊÖ¤¹´Ø¿ô¤òÄêµÁ¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡¥
¿ô³Ø¤Ç¤Ï¡¤¥Ù¥¯¥È¥ë¤Î¤è¤¦¤Ë¡¤Ê£¿ô¤Î¡Ö¤â¤Î¤Î½¸¤Þ¤ê¡×¤«¤é¡¤¤½¤ì¤¾¤ì¤ÎÍ×ÁǤò ʤ٤¿¤â¤Î¤òÍ×ÁǤȤ¹¤ë¤è¤¦¤Ê¡¤¿·¤¿¤Ê½¸¤Þ¤ê(½¸¹ç¤Î¸ÀÍդǤ¤¤¨¤Ð(¥Ç¥«¥ë¥È)ÀÑ)¤òÄêµÁ ¤¹¤ë¤³¤È¤¬¤¢¤ë¡¥¤½¤ì¤ÈƱ¤¸¤è¤¦¤Ë Objective Caml ¤Ç¤âÊ£¿ô¤ÎÃͤòʤ٤ơ¤¿·¤·¤¤¤Ò¤È¤Ä¤ÎÃͤòºî¤ë ¤³¤È¤¬¤Ç¤¤ë¡¥¤³¤Î¤è¤¦¤ÊÃͤòÁÈ(tuple)¤È¸Æ¤Ö¡¥tuple ¤Ï¡¤() Æâ¤Ë¡¤¼°¤ò , ¤Ç¶èÀڤäÆÊ¤٤ÆÉ½µ¤¹¤ë¡¥
# (1.0, 2.0);; - : float * float = (1., 2.)
·ë²Ì¤Î·¿ float * float ¤Ï¤³¤ÎÃͤ¬¡¤¡ÖÂè1Í×ÁÇ (1.0) ¤¬ float ¤Ç¡¤ Âè2Í×ÁÇ(2.0)¤â float ¤Ç¤¢¤ë¤è¤¦¤ÊÁȡפǤ¢¤ë¤³¤È¤ò¼¨¤¹¡¥* ¤ÏÁȤη¿¹½ÃÛ»Ò ¤Ç¤¢¤ë¡¥
ÁȤȤ·¤ÆÊ¤٤é¤ì¤ëÍ×ÁÇ¤ÏÆó¤Ä°Ê¾å(¥á¥â¥ê¤Îµö¤¹¸Â¤ê)¤¤¤¯¤Ä¤Ç¤â ¤è¤¯¡¤¤Þ¤¿Æ±¤¸·¿¤Î¼°¤Ç¤Ê¤¯¤Æ¤â¤è¤¤¡¥¤Þ¤¿¡¤¤â¤Á¤í¤ó¾¤ÎÃÍ¤ÈÆ±ÍÍ¤Ë let ¤Ç̾Á° ¤ò¤Ä¤±¤ë¤³¤È¤¬¤Ç¤¤ë¡¥
# let bigtuple = (1, true, "Objective Caml", 4.0);;
val bigtuple : int * bool * string * float = (1, true, "Objective Caml", 4.)
# let igarashi = ("Atsushi", "Igarashi", 10, 142)
(* Igarashi's office is at room #142 in 10th build. :-) *);;
val igarashi : string * string * int * int = ("Atsushi", "Igarashi", 10, 142)
ÁȤÎÃæ¤ÎÃͤ˥¢¥¯¥»¥¹¤¹¤ë¤Ë¤Ï¥Ñ¥¿¡¼¥ó¥Þ¥Ã¥Á(pattern matching) ¤Îµ¡Ç½¤ò»È¤¦¡¥¥Ñ¥¿¡¼¥ó¥Þ¥Ã¥Á¤Î³µÇ°¤Ï UNIX ¤Î grep ¤Ê¤É¤Î¥³¥Þ¥ó¥É¤Ç¤â¤ß¤é¤ì¤ë ¤¬¡¤¤ª¤ª¤¶¤Ã¤Ñ¤Ë¤Ï
¤¿¤á¤Îµ¡Ç½¤Ç¤¢¤ë¤È¤·¤Æ¤è¤¤¤À¤í¤¦1¡¥ Î㤨¤Ð¡¤(x, y, z, w)¤È¤¤¤¦¥Ñ¥¿¡¼¥ó¤Ï¡¤4Í×ÁǤ«¤é¤Ê¤ëÁȤ˥ޥåÁ¤·¡¤ x ¤òÂè1Í×ÁǤË, y ¤òÂè2Í×ÁǤË, z ¤òÂè3Í×ÁǤˡ¤ w ¤òÂè4Í×ÁǤˤ½¤ì¤¾¤ì«Çû¤¹¤ë¥Ñ¥¿¡¼¥ó¤Ç¤¢¤ë¡¥ ¥Ñ¥¿¡¼¥ó¤ÏÊÑ¿ô¤Î«Çû(let, ´Ø¿ô¤Î¥Ñ¥é¥á¡¼¥¿)¤ò ¤¹¤ë¤È¤³¤í¤Ë»ÈÍѤǤ¤ë¡¥Àè¤Û¤É¤Î¡¤bigtuple ¤ÎÍ×ÁǤϡ¤
# let (i, b, s, f) = bigtuple;; val i : int = 1 val b : bool = true val s : string = "Objective Caml" val f : float = 4.
¤Î¤è¤¦¤Ë¤·¤Æ¡¤¼è¤ê½Ð¤¹¤³¤È¤¬¤Ç¤¤ë¡¥¤³¤Î¥Ñ¥¿¡¼¥ó¤ÏÃͤιüÁȤߤÀ¤±¤Ç ³ÆÍ×ÁǤη¿¤Ë¤Ï¸ÀµÚ¤·¤Æ¤¤¤Ê¤¤¤Î¤Ç¡¤Æ±¤¸¥Ñ¥¿¡¼¥ó¤ÇÍ×ÁÇ·¿¤Î°Û¤Ê¤ë ÁȤ˥ޥåÁ¤µ¤»¤ë¤³¤È¤¬¤Ç¤¤ë¡¥
# let (i, b, s, f) = igarashi;; val i : string = "Atsushi" val b : string = "Igarashi" val s : int = 10 val f : int = 142
¸·Ì©¤Ë¤Ï¾å¤Î¥Ñ¥¿¡¼¥ó¤Ï4¤Ä¤ÎÊÑ¿ô¥Ñ¥¿¡¼¥ó¤ÈÁȥѥ¿¡¼¥ó ¤ò»È¤Ã¤Æ¹½À®¤µ¤ì¤ëÊ£¹çŪ¤Ê¥Ñ¥¿¡¼¥ó¤Ç¤¢¤ë¡¥ÊÑ¿ô¥Ñ¥¿¡¼¥ó¤Ï¡¤¡Öi¡×¤Î¤è ¤¦¤ËÊÑ¿ô̾¤Î¤ß¤«¤é¹½À®¤µ¤ì¡¤¡Ö²¿¤Ë¤Ç¤â¥Þ¥Ã¥Á¤·¡¤i¤ò¥Þ¥Ã¥Á¤·¤¿ÃͤË« Çû¤¹¤ë¡×¤â¤Î¤Ç¤¢¤ë¡¥2Áȥѥ¿¡¼¥ó¤Ï¡¤(⟨ ¥Ñ¥¿¡¼¥ó1 ⟩, …,⟨ ¥Ñ¥¿¡¼ ¥ón ⟩)¤È¤¤¤¦·Á¤Ç¤è¤ê¾®¤µ¤¤Éôʬ¥Ñ¥¿¡¼¥ó¤«¤é¹½À®¤µ ¤ì¤ë¡¥¥Ñ¥¿¡¼¥ó¤È¤·¤Æ¤Î²ò¼á¤Ï¡¤¡Ön¸Ä¤ÎÁȤǡ¤¤½¤ì¤¾¤ì¤ÎÍ×ÁǤ¬ ⟨ ¥Ñ¥¿¡¼¥ói ⟩¤Ë¥Þ¥Ã¥Á¤¹¤ë¤È¤Á´ÂΤ¬¥Þ¥Ã¥Á¤·¡¤Éôʬ¥Ñ¥¿¡¼¥ó¤¬ºî ¤ë«Çû¤ÎÁ´ÂΤò¥Ñ¥¿¡¼¥óÁ´ÂΤΫÇû¤È¤¹¤ë¡×¤È¤Ê¤ë¡¥¤Þ¤¿¡¤¤Ò¤È¤Ä¤Î¥Ñ¥¿¡¼¥ó Ãæ¤ËÊÑ¿ô¤Ï¤¿¤À1ÅÙ¤·¤«¸½¤ì¤ë¤³¤È¤¬¤Ç¤¤Ê¤¤¡¥Î㤨¤Ð¡¤ÁÈÃæ¤Î¤Õ¤¿¤Ä¤ÎÍ×ÁÇ ¤¬Åù¤·¤¤¤³¤È¤ò¥Ñ¥¿¡¼¥ó¤Çɽ¤¹¤³¤È¤Ï¤Ç¤¤Ê¤¤¡¥
# (* matching against a person whose first and family names are the same *) let (s, s, b, r) = igarashi;; let (s, s, b, r) = igarashi;; ^ This variable is bound several times in this matching
¤â¤¦¤Ò¤È¤Ä¡¤¤è¤¯»È¤¦¥Ñ¥¿¡¼¥ó¤ò¾Ò²ð¤·¤è¤¦¡¥ ¾å¤ÎÎã¤Ç¤Ï¡¤Á´Éô¤ÎÍ×ÁǤË̾Á°¤ò¤Ä¤±¤Æ¤¤¤ë¤¬¡¤¥×¥í¥°¥é¥à¤ÎÉôʬ¤Ë¤è¤Ã¤Æ¤Ï°ìÉô ¤ÎÍ×ÁǤÀ¤±¼è¤ê½Ð¤»¤Ð¤è¤¤¾ì¹ç¤â¤¢¤ë¡¥¤³¤Î¤è¤¦¤Ê¾ì¹ç¤Ë¤Ï¡¤ÊÑ¿ô¤ÎÂå¤ê¤Ë¡¤ _ (¥¢¥ó¥À¡¼¥¹¥³¥¢)¤È¤¤¤¦ ¡Ö²¿¤Ë¤Ç¤â¥Þ¥Ã¥Á¤¹¤ë¤¬¥Þ¥Ã¥Á¤·¤¿ÆâÍÆ¤Ï¼Î¤Æ¤ë¡× ¥ï¥¤¥ë¥É¥«¡¼¥É¥Ñ¥¿¡¼¥ó(wildcard pattern)¤È¸Æ¤Ö¥Ñ¥¿¡¼¥ó¤ò»ÈÍѤ¹¤ë¤³¤È¤¬¤Ç¤¤ë¡¥
# let (i, _, s, _) = bigtuple;; val i : int = 1 val s : string = "Objective Caml"
¼¡¤Ë¡¤float ¤Î¥Ú¥¢(2Í×ÁǤÎÁÈ)¤«¤é³ÆÍ×ÁǤÎÊ¿¶Ñ¤ò¤È¤ë´Ø¿ô¤òÄêµÁ¤·¤Æ¤ß ¤è¤¦¡¥¥Ñ¥é¥á¡¼¥¿¤òº£¤Þ¤Ç¤Î¤è¤¦¤ËÊÑ¿ô¤È¤¹¤ëÂå¤ê¤ËÁȥѥ¿¡¼¥ó¤òÍѤ¤¤Æ¡¤
# let average (x, y) = (x +. y) /. 2.0;; val average : float * float -> float = <fun>
¤ÈÀë¸À¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡¥average ¤Î·¿ float * float -> float ¤Ï ¡Ö¼Â¿ô¤Î¥Ú¥¢ float * float ¤ò¼õ¤±¼è¤ê¡¤¼Â¿ô¤òÊÖ¤¹¡×¤³¤È¤ò¼¨¤·¤Æ¤¤¤ë¡¥ (·¿¹½ÃÛ»Ò * ¤ÎÊý¤¬ -> ¤è¤ê¶¯¤¯·ë¹ç¤¹¤ë¤Î¤Ç¡¤¤³¤Î·¿¤Ï (float * float) -> float ¤ÈƱ¤¸°ÕÌ£¤Ç¤¢¤ë¡¥)¤³¤ì¤ò»È¤Ã¤Æ¡¤¤Õ¤¿¤Ä¤Î¼Â¿ô¤ÎÊ¿¶Ñ¤Ï
# average (5.7, -2.1);; - : float = 1.8
¤È¤·¤Æµá¤á¤é¤ì¤ë¡¥ ¤³¤Î¤è¤¦¤Ë¡¤ÁȤϡ¤°ú¿ô¤¬Ê£¿ô¤¢¤ë¤è¤¦¤Ê ´Ø¿ô¤òÌÏÊ魯¤ë¤¿¤á¤Ë¤è¤¯ÍѤ¤¤é¤ì¤ë¡¥¤³¤³¤Ç¡¤¤ï¤¶¤ï¤¶¡ÖÌÏÊï¡×¤È½ñ¤¤¤¿¤Î¤Ï¡¤ ¼ÂºÝ¤Ë¤Ï average ¤ÏÁȤò°ú¿ô¤È¤·¤Æ¤È¤ë1°ú¿ô´Ø¿ô¤Ç¤¢¤ë¤«¤é¤Ç¤¢¤ë¡¥ ¤Þ¤¿¡¤¼Â¤Ï Objective Caml ¤Î´Ø¿ô¤Ï¤¹¤Ù¤Æ1°ú¿ô´Ø¿ô¤Ç¤¢¤ë¡¥¤Ä¤Þ¤ê¡¤average ¤Ï
# let pair = (0.34, 1.2);; val pair : float * float = (0.34, 1.2) # average pair;; - : float = 0.77
¤È¤·¤Æ¸Æ¤Ó½Ð¤¹¤³¤È¤â¤Ç¤¤ë¤Î¤Ç¤¢¤ë¡¥µÕ¤Ë¡¤
# let average pair =
let (x, y) = pair in (x +. y) /. 2.0;;
val average : float * float -> float = <fun>
¤ÈÄêµÁ¤¹¤ë¤³¤È¤â¤Ç¤¤ë3¡¥
ÁȤÎÍ×ÁǤȤ·¤ÆÁȤò»È¤¦¤³¤È¤â¤Ç¤¤ë¡¥¼¡¤ÎÄêµÁ¤Ï¡¤(2¼¡¸µ)¥Ù¥¯¥È¥ë¤Î²Ã»» ¤ò¤¹¤ë¤â¤Î¤Ç¤¢¤ë¡¥
# let add_vec ((x1, y1), (x2, y2)) = (x1 +. x2, y1 +. y2);; val add_vec : (float * float) * (float * float) -> float * float = <fun>
¤³¤Î´Ø¿ô¤ÏÎ㤨¤Ð¼¡¤Î¤è¤¦¤Ë¸Æ¤Ó½Ð¤µ¤ì¤ë¡¥
# add_vec ((1.0, 2.0), (3.0, 4.0));; - : float * float = (4., 6.) # let (x, y) = add_vec (pair, (-2.0, 1.0));; val x : float = -1.66 val y : float = 2.2
¤³¤Î´Ø¿ô¤Ï¸«Êý¤Ë¤è¤Ã¤Æ¤Ï¡¤Ê£¿ô¤Î·×»»·ë²Ì(°ú¿ô¤È¤·¤ÆÍ¿¤¨¤é¤ì¤ë¤Õ¤¿¤Ä¤Î ¼Â¿ô¤Î¥Ú¥¢¤Î¡¤Âè1Í×ÁǤÎÏ¡¤¤ÈÂè2Í×ÁǤÎÏÂ)¤òƱ»þ¤ËÊÖ¤·¤Æ¤¤¤ë´Ø¿ô¤È»×¤¦ ¤³¤È¤â¤Ç¤¤ë¡¥¤³¤Î¤è¤¦¤Ë¡¤ÁȤϡ¤Ê£¿ô¤Î°ú¿ô¤òȼ¤¦´Ø¿ô¤À¤±¤Ç¤Ê¤¯¡¤Ê£¿ô¤Î ·ë²Ì¤òÊÖ¤¹´Ø¿ô¤òÌÏÊ魯¤ë¤Î¤Ë¤â»ÈÍѤµ¤ì¤ë¡¥
´Ø¿ôÄêµÁ¤ÏºÆµ¢Åª¤Ë¡¤¤Ä¤Þ¤êÄêµÁ¤Î¤Ê¤«¤Ç¼«Ê¬¼«¿È¤ò»²¾È¤¹¤ë¤è¤¦¤Ë¡¤¹Ô¤¦¤³¤È¤â ²Äǽ¤Ç¤¢¤ë¡¥¤³¤Î¤è¤¦¤ÊºÆµ¢´Ø¿ô(recursive function)¤Ï¡¤·«¤êÊÖ¤·¤ò ȼ¤¦¤è¤¦¤Ê·×»»¤òɽ¸½¤¹¤ë¤¿¤á¤ËÍѤ¤¤ë¤³¤È¤¬¤Ç¤¤ë¡¥
¤Þ¤º¤Ï´Êñ¤ÊÎ㤫¤é¸«¤Æ¤¤¤³¤¦¡¥¼«Á³¿ô n ¤Î³¬¾è n! = 1 × 2 × ⋯ × n ¤ò·×»»¤¹¤ë´Ø¿ô¤ò¹Í¤¨¤ë¡¥¤³¤Î¼°¤òÊ̤θ«Êý¤ò¤¹¤ë¤È¡¤
¤³¤È¤¬¤ï¤«¤ë¡¥¤³¤ì¤Ï¡¤¼«Ê¬¼«¿È¤ò»È¤Ã¤ÆÄêµÁ¤·¤Æ¤¤¤ëºÆµ¢Åª¤ÊÄêµÁ¤Ç¤¢¤ë¡¥ ¤¿¤À¤·¡¤Â礤ʿô¤Î³¬¾è¤Ï¤è¤ê¾®¤µ¤Ê¿ô¤Î³¬¾è¤«¤éÄêµÁ¤µ¤ì¤Æ¤ª¤ê¡¤ 1 ¤Ë´Ø¤·¤Æ¤Ï¡¤¼«Ê¬¼«¿È¤Ë¸ÀµÚ¤¹¤ë¤³¤È¤Ê¤¯ÄêµÁ¤µ¤ì¤Æ¤¤¤ë¡¥¤³¤ì¤Ï ºÆµ¢ÄêµÁ¤¬°ÕÌ£¤ò¤Ê¤¹¤¿¤á¤Î¡¤Èó¾ï¤Ë½ÅÍפʥݥ¤¥ó¥È¤Ç¤¢¤ë¡¥ ¤³¤Îµ¬Â§¤ò Objective Caml ¤ÇÄêµÁ¤¹¤ë¤È¡¤
# let rec fact n = (* factorial of positive n *)
if n = 1 then 1 else fact (n-1) * n;;
val fact : int -> int = <fun>
¤È¤Ê¤ë¡¥(n-1¤Ë³ç¸Ì¤¬É¬Íפʤ³¤È¤ËÃí°Õ¡¥) ´Ø¿ôËÜÂÎÃæ¤Ë fact ¤¬½Ð¸½¤·¤Æ¤¤¤ë¤³¤È¤¬¤ï¤«¤ë¤À¤í¤¦¡¥ ¤Þ¤¿¡¤¾å¤Ç½Ò¤Ù¤¿µ¬Â§¤¬ÁÇľ¤Ë¥×¥í¥°¥é¥à¤µ¤ì¤Æ¤¤¤ë¤³¤È¤¬¤ï¤«¤ë¡¥ ¤³¤Î fact ¤ÏÀµ¤ÎÀ°¿ô¤ËÂФ·¤Æ¤Ï¡¤Àµ¤·¤¤Åú¤¨¤òÊÖ¤¹¡¥
# fact 4;; - : int = 24
°ìÈ̤ˤϡ¤ºÆµ¢´Ø¿ô¤òÄêµÁ¤¹¤ëºÝ¤Ë¤Ï¥¡¼¥ï¡¼¥É rec ¤ò let ¤Î¸å¤Ë¤Ä¤±¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤³¤È°Ê³°¡¤Ê¸Ë¡¤ÏÉáÄ̤δؿôÄêµÁ¤È Ʊ¤¸¤Ç¤¢¤ë¡¥¤Þ¤¿¡¤rec ¤¬Í¸ú¤Ê¤Î¤Ï´Ø¿ôÀë¸À¤Î¤ß¤Ç¤¢¤ë5¡¥
# let rec x = x * x + 1;; let rec x = x * x + 1;; ^^^^^^^^^ This kind of expression is not allowed as right-hand side of `let rec'
¤Ï¥¨¥é¡¼¤Ç¤¢¤ë(¤½¤â¤½¤â¡ÖÄêµÁ¡×¤È¤¤¤¨¤Ê¤¤¡¥¤Þ¤¿¡¤x ¤Ë´Ø¤¹¤ëÆó¼¡ÊýÄø¼° x = x2 −1 ¤ò²ò¤¤¤Æ¤¯¤ì¤ë¤ï¤±¤Ç¤â¤Ê¤¤¡¥)
ºÆµ¢´Ø¿ô¤òÄêµÁ¤¹¤ëºÝ¤Ë¤Ï¡¤¤³¤Î³¬¾è¤ÎÎã¤Î¤è¤¦¤Ë¡¤²¿¤é¤«¤Î°ÕÌ£¤Ç °ú¿ô¤¬¸º¾¯¤·¤Æ¤¤¤¯¤³¤È¤¬½ÅÍפǤ¢¤ê¡¤¼ÂºÝ¤Î´Ø¿ôÄêµÁ¤Ï
¤È¤ò¾ì¹ç¤ï¤±¤ò»È¤Ã¤ÆÁȤ߹ç¤ï¤»¤ë¤³¤È¤«¤é¤Ê¤ë¡¥°ìÈÌŪ¤Ê¥¢¥É¥Ð¥¤¥¹¤È¤·¤Æ¡¤ ºÆµ¢´Ø¿ô¤òÄêµÁ¤¹¤ë¤È¤¤Ë¤Ï¡Ö¤É¤¦¤ä¤Ã¤Æ·×»»¤¹¤ë¤«¡×¤è¤ê¤â ¡Ö¤³¤Î´Ø¿ô¤Ï²¿¤ò·×»»¤¹¤ë¤Î¤«¡×¤È¤¤¤¦¤³¤È¤ò¡¤¤Þ¤º¤Ï¤Ã¤¤ê ¤µ¤»¤ë¤³¤È¤¬½ÅÍפǤ¢¤ë¡¥
¤µ¤Æ¡¤¤³¤ì¤Þ¤Ç¤Ë¡¤¼°¤ÏÃͤËɾ²Á¤µ¤ì¤ë¤³¤È¡¤´Ø¿ôŬÍѼ° ¤Ï¡¤¥Ñ¥é¥á¡¼¥¿¤ò¼Â°ú¿ô¤ÇÃÖ¤´¹¤¨¤¿¤è¤¦¤Ê¼°¤òɾ²Á¤¹¤ë6¡¤¤È¤¤¤¦¤³¤È ¤Ï³Ø¤ó¤À¤¬¡¤square(square(2)) ¤Î¤è¤¦¤Ê¼°¤Î¡¤Æó¤Ä¤¢¤ë´Ø¿ôŬÍѤΤ¦¤Á¡¤ ¤É¤Á¤é¤òÀè¤Ëɾ²Á¤¹¤ë¤«¡¤¤È¤¤¤Ã¤¿¡Ö¤É¤Î¤è¤¦¤Ê½çÈ֤ǡ×ÃͤËɾ²Á¤µ¤ì¤ë¤« ¤Ë¤Ä¤¤¤Æ¤ÏÀâÌÀ¤·¤Æ¤³¤Ê¤«¤Ã¤¿¡¥ ¤½¤Î¤Ò¤È¤Ä¤ÎÍýͳ¤Ï¡¤ ºÆµ¢´Ø¿ô¤òƳÆþ¤¹¤ë¤Þ¤Ç¤Ë¤Õ¤ì¤¿¼°¤Ë¤Ä¤¤¤Æ¤Ï¡¤É¾²ÁÊýË¡¤Ë´Ø¤ï¤é¤º Ãͤ¬ÊѤé¤Ê¤«¤Ã¤¿¤«¤é¤Ç¤¢¤ë¡¥ ¤³¤Î¤è¤¦¤ÊÉôʬ¼°¤Îɾ²Á½ç½ø¤òɾ²ÁÀïά(evaluation strategy)¤È¤¤¤¦¡¥ ¤³¤³¤Ç¤¹¤³¤·´ó¤êÆ»¤ò¤·¤Æ¡¤¤¤¤í¤¤¤í¤Êɾ²ÁÀïά¤ò¤ß¤Æ¤¤¤³¤¦¡¥
ºÇ¤âñ½ã¤«¤Ä¿Í´Ö¤¬»æ¤Î¾å¤Ç·×»»¤¹¤ë¾ì¹ç¤È¶á¤¤¤Î¤¬¡¤ ¡Ö´Ø¿ô¤òŬÍѤ¹¤ë¤È¤¤Ë¤Ï¤Þ¤º°ú¿ô¤òÃͤËɾ²Á¤¹¤ë¡×¤È¤¤¤¦ Ã͸ƽФ·(call-by-value)¤ÎÀïά¤Ç¤¢¤ë¡¥ Î㤨¤Ð¡¤¾å¤Î¼°¤Ï square ¤ÎÄêµÁ¤ò
# let square x = x * x;; val square : int -> int = <fun>
¤È¤¹¤ë¤È¡¤
|
¤È¤¤¤¦¤è¤¦¤Ë¡¤¤Þ¤º¡¤³°Â¦¤Î square ¤Î°ú¿ô¤Ç¤¢¤ë square(2) ¤Îɾ²Á¤ò ¹Ô¤Ã¤Æ¤¤¤ë¡¥Objective Caml ¤ò´Þ¤à¿¤¯¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤Ï¡¤Ã͸ƽФ·¤¬»È¤ï¤ì¤Æ¤¤ ¤ë¡¥
¼¡¤ËºÆµ¢¤òȼ¤¦É¾²Á¤Ë¤Ä¤¤¤Æ¸«¤Æ¤ß¤è¤¦¡¥fact 4 ¤Ï¡¤°Ê²¼¤Î¤è¤¦¤Ê¼ê½ç¤Ç ɾ²Á¤µ¤ì¤ë¡¥
|
Ã͸ƽФ·¤Ïľ´ÑŪ¤Ç¿¤¯¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç»È¤ï¤ì¤Æ¤¤¤ë¤â¤Î¤Î¡¤Í¾·×¤Ê ·×»»¤ò¹Ô¤Ã¤Æ¤·¤Þ¤¦¤³¤È¤¬¤¢¤ë¤È¤¤¤¦·çÅÀ¤¬¤¢¤ë¡¥Î㤨¤Ð¡¤(¤ä¤ä¿Í¹©Åª¤ÊÎ㠤Ǥ¢¤ë¤¬)
# let zero (x : int) = 0;; val zero : int -> int = <fun>
¤Î¤è¤¦¤Ê´Ø¿ô¤Ï¡¤°ú¿ô¤¬¤É¤ó¤ÊÀ°¿ô¤Ç¤¢¤í¤¦¤È¤â¡¤0¤òÊÖ¤¹¤Ë¤â´Ø¤ï¤é¤º¡¤ zero(square(square(2))) ¤Î¤è¤¦¤Ê¼°¤Îɾ²Á¤ÎºÝ¡¤°ú¿ô¤ò·×»»¤·¤Æ¤·¤Þ¤¦¡¥ ¤Þ¤¿¡¤Ã͸ƤӽФ·¤Î¸À¸ì¤Ç¤Ï¡¤¾ò·ïʬ´ô¤ò´Ø¿ô¤Çɽ¸½¤¹¤ë¤³¤È¤Ï¤Ç¤¤Ê¤¤(Îý ½¬ÌäÂ껲¾È)¡¥
¤³¤Î·çÅÀ¤Ï¡¤¤È¤Ë¤«¤¯°ú¿ô¤òÀè¤Ëɾ²Á¤·¤Æ¤¤¤¯¤³¤È(¤³¤ÎÀ¼Á¤ò eagerness, strictness ¤È¸Æ¤Ö¤³¤È¤¬¤¢¤ë)¤Ëµ¯°ø¤¹¤ë¡¥¤³¤ì¤ËÂФ·¤Æ¡¤¤¤¤Þ¤«¤é½Ò¤Ù¤ë ¤Õ¤¿¤Ä¤ÎÀïά¤Ï¡¤lazy ¤Êɾ²Á¤È¸Æ¤Ð¤ì¡¤¡Ö°ú¿ô¤Ï»È¤¦¤Þ¤Çɾ²Á¤·¤Ê¤¤¡×Àïά¤Ç¤¢¤ë¡¥
¤Þ¤º¡¤lazy ¤ÊÀïά¤Î¤Ò¤È¤Ä¤á¤¬¡¤¡Ö³°Â¦¤Î´Ø¿ôŬÍѤ«¤é¡¤°ú¿ô¤ò¼°¤Î¤Þ¤Þ¥Ñ¥é¥á¡¼ ¥¿¤ËÃÖ´¹¤¹¤ë¡×̾Á°¸Æ½Ð¤·(call-by-name)¤Ç¤¢¤ë¡¥¤³¤ÎÀïά¤Î²¼¤Ç¤Ï¡¤ Àè¤Û¤É¤Î square(square(2)) ¤ª¤è¤Ó¡¤zero(square(square(2))) ¤Ï¡¤¤½¤ì¤¾¤ì¡¤
|
¤Î¤è¤¦¤Ëɾ²Á¤µ¤ì¤ë¡¥¤¿¤·¤«¤Ë°ú¿ô¤ò»È¤ï¤Ê¤¤´Ø¿ô¤Îɾ²Á¤Ë¤ª¤¤¤Æ¤Ï̵Â̤¬ ¤Ê¤¯¤Ê¤Ã¤Æ¤¤¤ë¤³¤È¤¬¤ï¤«¤ë¡¥¤½¤ÎÂå¤ï¤ê¤Ë¡¤·×»»¼°¤ò¤½¤Î¤Þ¤Þ¥³¥Ô¡¼¤·¤Æ¤·¤Þ¤¦ ¤¿¤á¤Ë¡¤Éôʬ¼° square(2) ¤Î·×»»¤¬ÆóÅÙȯÀ¸¤·¤Æ¤¤¤ë¡¥
¤³¤Î·çÅÀ¤ò¤Ê¤¯¤·¤¿¤â¤Î¤¬¡¤É¬Í׸ƽФ·(call-by-need)¤ÎÀïά¤Ç¤¢ ¤ë¡¥¤³¤ì¤Ï¡¤¡Ö³°Â¦¤Î´Ø¿ôŬÍѤ«¤é¡¤°ú¿ô¤ò¼°¤Î¤Þ¤Þ¥Ñ¥é¥á¡¼ ¥¿¤ËÃÖ´¹¤¹¤ë¤¬¡¤°ìÅÙɾ²Á¤·¤¿¼°¤Ï¡¤·ë²Ì¤ò³Ð¤¨¤Æ¤ª¤¤¤ÆÆóÅÙɾ²Á¤·¤Ê¤¤¡×¤â¤Î¤Ç¡¤ ¥Ñ¥é¥á¡¼¥¿¤ò°ú¿ô¤ÇÃÖ´¹¤¹¤ëÂå¤ê¤Ë¡¤°ú¿ô¼°¤Î¶¦Í´Ø·¸¤ò¼¨¤·¤¿¤è¤¦ ¤Ê¥°¥é¥Õ¤Ç¹Í¤¨¤ë¤È¤ï¤«¤ê¤ä¤¹¤¤¡¥
| square(square(2)) | → |
* /^/[d] /_/[d] square(2) | → |
* /^/[d] /_/[d] * /^/[d] /_/[d] 2 | → |
* /^/[d] /_/[d] 4 | → | 16 |
call-by-need ¤Çɾ²Á¤¬¹Ô¤ï¤ì¤ë¸À¸ì¤Ë¤Ï Haskell, Miranda ¤Ê¤É¤¬¤¢¤ê¡¤¤¤ ¤º¤ì¤â´Ø¿ô·¿¸À¸ì¤Ç¤¢¤ë¡¥lazy ¤Ê¸À¸ì¤Ë¤Ï̵¸Â¤ÎÂ礤µ¤ò»ý¤Ä¹½Â¤¤Ê¤É¤ò¤ ¤ì¤¤¤Ëɽ¸½¤Ç¤¤ë¤Ê¤É¤ÎÍøÅÀ¤¬¤¢¤ë¤¬¡¤Éôʬ¼°¤¬¤¤¤Äɾ²Á¤µ¤ì¤ë¤«¤ï¤«¤ê¤Ë¤¯ ¤¤¤¿¤á¡¤Æþ½ÐÎϤʤɤȤÎÁêÀ¤¬°¤¤¡¥¤Þ¤¿¼ÂÁõ¤â call-by-value ¸À¸ì¤ËÈæ¤Ù Ê£»¨¤Ç¤¢¤ë¡¥(¾å¤Ë¼¨¤·¤¿¤è¤¦¤Ê¥°¥é¥Õ¤Î½ñ¤´¹¤¨¤ËÁêÅö¤¹¤ë graph reduction ¤È¤¤¤¦µ»½Ñ¤¬¤è¤¯ÍѤ¤¤é¤ì¤Æ¤¤¤ë¡¥)
¤³¤³¤Ç¥×¥í¥°¥é¥à¤Î¥Ç¥Ð¥°¤ËÊØÍø¤Ê¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤ò¾Ò²ð¤·¤Æ¤ª¤³¤¦¡¥ #trace ⟨ ´Ø¿ô̾ ⟩;; ¤È¤¹¤ë¤È¡¤¤½¤Î´Ø¿ô¤ËÍ¿¤¨¤é¤ì¤¿ °ú¿ô¤È·ë²Ì¤ò¸Æ½Ð¤µ¤ì¤¿½ç¤Ëɽ¼¨¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡¥
# #trace fact;; fact is now traced. # fact 4;; fact <– 4 fact <– 3 fact <– 2 fact <– 1 fact –> 1 fact –> 2 fact –> 6 fact –> 24 - : int = 24
¤Þ¤¿¡¤#untrace ¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤Ç°Ê¹ß¤Îɽ¼¨¤ò¤ä¤á¤ë¤³¤È¤¬¤Ç¤¤ë¡¥
# #untrace fact;; fact is no longer traced. # fact 5;; - : int = 120
¾å¤ÇÄêµÁ¤·¤¿ fact ´Ø¿ô¤Îɾ²Á¤ÎÍͻҤò¤ß¤ë¤È¤ï¤«¤ë¤è¤¦¤Ë¡¤ ·×»»ÅÓÃæ¤Ç¡Ö´Ø¿ô¸Æ¤Ó½Ð¤·¸å¤Ë¡¤¤¢¤È¤Ç·×»»¤µ¤ì¤ëÉôʬ¡× ((...) * 3) * 4 ¤È¤¤¤Ã¤¿¤â¤Î¤ò²¿¤é¤«¤Î·Á¤Çµ²±¤·¤Æ ¤ª¤«¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥n ¤¬Â礤¯¤Ê¤ë¤È ¤³¤Î¼°¤ÎÂ礤µ¤âÂ礤¯¤Ê¤ê¡¤É¾²Á¤ËɬÍפʶõ´Ö»ÈÍÑÎ̤¬Â礤¯ ¤Ê¤Ã¤Æ¤·¤Þ¤¦¡¥¤È¤³¤í¤¬¾è»»¤Ë´Ø¤·¤Æ¤Ï·ë¹ç§¤«¤é¡¤ ((n−2)! · (n−1)) · n) = (n−2)! · ((n−1) · n) ¤¬À®Î©¤¹¤ë¤¿¤á (n−2)! ¤Î·×»»¤Ë¤È¤ê¤«¤«¤ëÁ°¤Ë¡¤n · (n−1) ¤òÀè¤Ë ·×»»¤·¤Æ¤·¤Þ¤¦¤³¤È¤Ç¡¤¡Ö¤¢¤È¤Ç·×»»¤¹¤ëÉôʬ¡×¤ÎÂ礤µ¤ò¾®¤µ¤¯ÊݤĤ³¤È¤¬ ²Äǽ¤Ç¤¢¤ë¡¥ ¤³¤Î¤è¤¦¤Ê¹©Éפò¥×¥í¥°¥é¥à¤¹¤ë¤³¤È¤ò¹Í¤¨¤ë¤È¡¤°ú¿ô n ¤Î¾ðÊó°Ê³°¤Ë¡¤ ¡ÖËÜÍè¤Ê¤é»Ä¤ê¤Î·×»»¤Ç¤¢¤ë¼°¤Î·ë²Ì¡×¤Î¾ðÊó¤¬É¬ÍפǤ¢¤ê¡¤
# let rec facti (n, res) = (* iterative version of fact *)
if n = 1 then res (* equal to res * 1 *)
else facti (n - 1, n * res);;
val facti : int * int -> int = <fun>
¤Î¤è¤¦¤ÊÄêµÁ¤Ë¤Ê¤ë¡¥°ú¿ô res ¤¬¡¤fact ¤Î¼Â¹Ô²áÄø¤Ë¤ª¤±¤ë ºÆµ¢¸Æ½Ð¤·¤Î³°Â¦¤Î¾è»»¼°¤ÎÃͤËÂбþ¤¹¤ë¡¥¤³¤Î´Ø¿ô¤Ï¡¤ Àµ³Î¤Ë¤Ï¡¤facti (n,m) ¤Ç¡¤n! · m ¤ò·×»»¤¹¤ë¡¥
# facti (4, 1);; - : int = 24
°Ê²¼¤Ë¡¤facti (4, 1) ¤Îɾ²Á¤ÎÍͻҤò¼¨¤¹¡¥
|
fact 4 ¤È°ã¤¤¡¤·×»»¤ÎÅÓÃæ·Ð²á¤Î¼°¤¬¾®¤µ¤¤(°ú¿ô¤ÎÂ礤µ¤Ë°Í¸¤·¤Ê¤¤)¤³¤È¤¬ ¤ï¤«¤ë¤À¤í¤¦¡¥¤Þ¤¿¡¤¤É¤ÎÃʳ¬¤Ë¤ª¤¤¤Æ¤â facti ¤Î°ú¿ô n, m ¤Ë´Ø¤·¤Æ¡¤
| n! · m = 120 = 4! |
¤¬À®Î©¤·¤Æ¤¤¤ë¡¥¤³¤Î¤è¤¦¤ÊÄêµÁ¤ò¡¤ºÆµ¢¸Æ½Ð¤·¤¬ËÜÂÎÃæ¤Î·×»»¤Î°ìÈֺǸå¤Ë ¤¢¤ë¤³¤È¤«¤é¡¤ËöÈøºÆµ¢Åª(tail-recursive)¤Ç¤¢¤ë¡¤¤È¤¤¤¦¡¥°ì È̤ˤϺƵ¢´Ø¿ô¤ÏºÆµ¢¤¬¿¼¤¯¤Ê¤ë¤Ë¤Ä¤ì¡¤¥á¥â¥ê¤Î»ÈÍÑÎ̤¬ÁýÂ礹¤ë¤¬¡¤¸¤¤ ¥³¥ó¥Ñ¥¤¥é¤ÏËöÈøºÆµ¢´Ø¿ô¤ò(¼«Æ°Åª¤Ë)ÆÃḚ̂·¤¤¤·¤Æ¡¤¥á¥â¥ê¤Î»ÈÍÑÎ̤¬ºÆµ¢ ¤Î¿¼¤µ¤Ë´Ø¤ï¤é¤º¸ÇÄêÎ̤Ǥ¢¤ë¤è¤¦¤Ê¥³¡¼¥É¤òÀ¸À®¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡¥¤Þ¤¿¡¤ ¤³¤Î´Ø¿ôÄêµÁ¤Ï C ¸À¸ì¤Ê¤É¤Ç¹Ô¤Ê¤¦ for ʸ¤Ê¤É¤Î·«¤êÊÖ¤·¹½Ê¸¤ò»È¤Ã¤¿¥× ¥í¥°¥é¥à¤Ë»÷¤Æ¤¤¤ë¤¿¤á¡¤È¿ÉüŪ(iterative)¤ÊÄêµÁ¤È¤¤¤¦¤³¤È¤â ¤¢¤ë¡¥¤É¤ó¤ÊºÆµ¢´Ø¿ô¤âÈ¿ÉüŪ¤ËÄêµÁ¤¹¤ì¤Ð¤è¤¤¤È¤¤¤¦¤ï¤±¤Ç¤â¤Ê¤¤¡¥¼ÂºÝ¡¤ ÁÇËѤʺƵ¢ÅªÄêµÁ¤òÈ¿ÉüŪ¤Ë¤¹¤ë¤È°ú¿ô¤Î¿ô¤¬¤Ò¤È¤ÄÁý¤¨¡¤¤½¤ì¤Ëȼ¤Ã¤ÆÄêµÁ ¤Î¤ï¤«¤ê¤ä¤¹¤µ¤¬¤«¤Ê¤ê¸º¾¯¤¹¤ë¡¥¤Þ¤¿¡¤(´·¤ì¤ì¤Ð) fact ¤«¤é facti ¤ÎÄêµÁ¤òƳ¤¯¤Î¤Ï¤Û¤Üµ¡³£Åª¤Ê¤Î¤À¤¬¡¤¤è¤êÊ£»¨¤Ê(¶ñÂÎŪ¤Ë¤Ï ºÆµ¢¸Æ¤Ó½Ð¤·¤¬Ê£¿ô²óȯÀ¸¤¹¤ë¤è¤¦¤Ê)ºÆµ¢´Ø¿ô¤Ç¤Ï¡¤Ã±½ã¤ËÈ¿ÉüŪ¤Ê ÄêµÁ¤ËÊÑ´¹¤¹¤ë¤³¤È¤Ï¤Ç¤¤Ê¤¤¡¥
¤È¤³¤í¤Ç¡¤¤³¤³¤Ç¤Ï facti ¤ò¥È¥Ã¥×¥ì¥Ù¥ë¤Î´Ø¿ô¤È¤·¤ÆÀë¸À¤·¤¿¤¬¡¤ ¤³¤ì¤Ï¤¤¤ï¤ÐÊä½õŪ¤Ê´Ø¿ô¤Ç¤¢¤ë¡¥Âè1°ú¿ô¤ò1°Ê³° ¤Ç¤è¤ÖɬÍפ¬¤Ê¤¤¾ì¹ç¤Ï¡¤facti ¤ò¸íÍѤµ¤ì¤Ê¤¤¤è¤¦¤Ë¡¤
# let fact n = (* facti is localized *)
let rec facti (n, res) =
if n = 1 then res else facti (n - 1, res * n)
in facti (n, 1);;
val fact : int -> int = <fun>
¤Î¤è¤¦¤Ë¡¤¶É½êŪ¤ËÀë¸À¤¹¤ë¤«¡¤
# let rec fact (n, res) = if n = 1 then res else fact (n - 1, res * n);; val fact : int * int -> int = <fun> # let fact n = fact (n, 1);; val fact : int -> int = <fun>
Ʊ¤¸Ì¾Á°¤Î´Ø¿ô¤òÀë¸À¤¹¤ë¤³¤È¤Ç±£¤¹¤Î¤¬¡¤Objective Caml¥×¥í¥°¥é¥ß¥ó¥°¤Î¾ïÅå ¥Æ¥¯¥Ë¥Ã¥¯¤È¤·¤Æ»È¤ï¤ì¤ë¡¥
¤³¤ì¤Þ¤Ç¤ËÅо줷¤¿ºÆµ¢´Ø¿ô¤ÏºÆµ¢¸Æ½Ð¤·¤ò¹Ô¤¦¾ì½ê¤¬¤»¤¤¤¼¤¤1¸Ä½ê¤·¤«¤Ê¤«¤Ã¤¿¡¥ ¤³¤Î¤è¤¦¤ÊºÆµ¢¤Î»ÅÊý¤òÀþ·ÁºÆµ¢¤È¸Æ¤Ö¤³¤È¤¬¤¢¤ë¡¥¤³¤³¤Ç¤ÏºÆµ¢¸Æ½Ð¤·¤¬ 2¸Ä½ê°Ê¾å¤Ç¹Ô¤ï¤ì¤ë¤è¤¦¤ÊºÆµ¢´Ø¿ô¤ò¤¤¤¯¤Ä¤«¤ß¤Æ¤¤¤¯¡¥
¥Õ¥£¥Ü¥Ê¥Ã¥Á¿ôÎó Fi¤Ï°Ê²¼¤ÎÁ²²½¼°¤òËþ¤¿¤¹¤è¤¦¤Ê¿ôÎó¤Ç¤¢¤ë¡¥
|
n ÈÖÌܤΥե£¥Ü¥Ê¥Ã¥Á¿ô¤òµá¤á¤ë´Ø¿ô¤Ï¡¤
# let rec fib n = (* nth Fibonacci number *)
if n = 1 || n = 2 then 1 else fib(n - 1) + fib(n - 2);;
val fib : int -> int = <fun>
¤È¤·¤ÆÀë¸À¤Ç¤¤ë¡¥elseÀá¤ËºÆµ¢¸Æ½Ð¤·¤¬2¸Ä½ê¸½¤ì¤Æ¤¤¤ë¡¥
¤·¤«¤·¡¤¤³¤ÎÄêµÁ¤Ï¡¤Fn ¤Î·×»»¤ËFn−2¤Î·×»»¤¬ ÆóÅÙȯÀ¸¤¹¤ë¤Ê¤É¡¤Èó¾ï¤Ë¿¤¯¤ÎºÆµ¢¸Æ½Ð¤·¤òȼ¤¦¤¿¤á¤Ë¸úΨŪ¤Ç¤Ï¤Ê¤¤¡¥ (fib 30 ¤Îɾ²Á¤ò»î¤·¤Æ¤ß¤è¡¥)¤³¤ì¤ò²þÁ±¤·¤¿¤Î¤¬¡¤¼¡¤ÎÄêµÁ¤Ç¤¢¤ë¡¥
# let rec fib_pair n =
if n = 1 then (0, 1)
else
let (prev, curr) = fib_pair (n - 1) in (curr, curr + prev);;
val fib_pair : int -> int * int = <fun>
¤³¤ÎÄêµÁ¤Ç¤Ï¡¤n ¤«¤é Fn ¤È¤È¤â¤Ë Fn−1 ¤â ·×»»¤¹¤ë¡¥¤Þ¤¿¡¤Àþ·ÁºÆµ¢ÅªÄêµÁ¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡¥
Euclid ¤Î¸ß½üË¡¤Ï¡¤¼«Á³¿ô m ¤È n (¤¿¤À¤· m < n) ¤ÎºÇÂç¸øÌó¿ô¤Ï¡¤n ÷ m ¤Î¾ê;¤È m ¤ÎºÇÂç¸øÌó¿ô¤Ë Åù¤·¤¤À¼Á¤òÍѤ¤¤Æ¡¤ÆóÀ°¿ô¤ÎºÇÂç¸øÌó¿ô¤òµá¤á¤ëÊýË¡¤Ç¤¢¤ë¡¥
n ¸Ä¤Î¤â¤Î¤Î¤Ê¤«¤«¤é m ¸Ä¤Î¤â¤Î¤òÁª¤Ó¤À¤¹Áȹç¤ï¤»¤Î¾ì¹ç¤Î¿ô (
| n |
| m |
) ¤Ï¡¤
| ⎛ ⎜ ⎝ |
| ⎞ ⎟ ⎠ | = |
|
¤ÇÄêµÁ¤µ¤ì¤ë¡¥¤³¤ì¤òºÆµ¢Åª¤Ë
|
¤ÈÄêµÁ¤¹¤ë¤³¤È¤â¤Ç¤¤ë¡¥
ºÇ¸å¤Ë¡¤Æó¤Ä°Ê¾å¤Î´Ø¿ô¤¬¤ª¸ß¤¤¤ò¸Æ¤Ó¹ç¤¦Áê¸ßºÆµ¢(mutual recursion)¤ò¤ß¤ë¡¥Áê¸ßºÆµ¢´Ø¿ô¤Ï¡¤°ìÈÌŪ¤Ë
let rec f1 ⟨ ¥Ñ¥¿¡¼¥ó1 ⟩ = e1 and f2 ⟨ ¥Ñ¥¿¡¼¥ó2 ⟩ = e2 ⋮ and fn ⟨ ¥Ñ¥¿¡¼¥ón ⟩ = en
¤È¤¤¤¦·Á¤ÇÄêµÁ¤µ¤ì¤ë¡¥³ÆËÜÂΤμ° ei ¤Ë¤Ï¼«Ê¬¼«¿È¤Ç¤¢¤ë fi ¤À¤±¤Ç¤Ê¤¯Æ±»þ¤ËÄêµÁ¤µ¤ì¤ë f1, …, fn Á´¤Æ¤ò¸Æ¤Ö¤³¤È¤¬¤Ç¤¤ë¡¥
Èó¾ï¤ËÇϼ¯Çϼ¯¤·¤¤Îã¤Ç¤Ï¤¢¤ë¤¬¡¤¼¡¤Î´Ø¿ô even, odd ¤Ï
¤È¤¤¤¦ºÆµ¢Åª¤ÊÄêµÁ¤Ë´ð¤Å¤¡¤Í¿¤¨¤é¤ì¤¿Àµ¤ÎÀ°¿ô¤¬¶ö¿ô¤«´ñ¿ô¤«È½Äꤹ¤ë´Ø¿ô¤Ç ¤¢¤ë¡¥
# let rec even n = (* works for positive integers *)
if n = 0 then true else odd(n - 1)
and odd n =
if n = 0 then false else even(n - 1);;
val even : int -> bool = <fun>
val odd : int -> bool = <fun>
# even 6;;
- : bool = true
# odd 14;;
- : bool = false
¤â¤¦¾¯¤·¡¤¸½¼ÂŪ¤ÊÎã¤È¤·¤Æ¡¤arctan1 ¤ÎŸ³«·Á
| = 1 − |
| + |
| − |
| ⋯ + |
| − |
| ⋯ |
¤ò¹Í¤¨¤ë¡¥ÅÓÃæ¤Þ¤Ç¤ÎϤòµá¤á¤ë´Ø¿ô¤Ï¡¤Àµ¤Î¹à¤ò¤¹´Ø¿ô¤È Éé¤Î¹à¤ò¤¹´Ø¿ô¤òÁê¸ßºÆµ¢Åª¤ËÄêµÁ¤Ç¤¤ë¡¥
# let rec pos n =
neg (n-1) +. 1.0 /. (float_of_int (4 * n + 1))
and neg n =
if n < 0 then 0.0
else pos n -. 1.0 /. (float_of_int (4 * n + 3));;
val pos : int -> float = <fun>
val neg : int -> float = <fun>
# 4.0 *. pos 200;;
- : float = 3.14408641529876087
# 4.0 *. pos 800;;
- : float = 3.14221726314786043
¤æ¤Ã¤¯¤ê¤È π/4 ¤Ë¼ý«¤·¤Æ¹Ô¤¯(¸íº¹¤¬¤¢¤ë¤Î¤Ç ¼ÂºÝ¤Ë¤Ï¤Á¤ç¤Ã¤È°ã¤¦Ãͤ˼ý«¤·¤Æ¤·¤Þ¤¦¤¬)¡¥
# let cond (b, e1, e2) : int = if b then e1 else e2;; val cond : bool * int * int -> int = <fun> # let rec fact n = cond ((n = 1), 1, n * fact (n-1));; val fact : int -> int = <fun>
# fact 4;; ????
| n |
| m |
Objective Caml ¤ò»Ï¤á¤È¤¹¤ë´Ø¿ô·¿¸À¸ì¤Ç¤Ï¡¤´Ø¿ô¤òÀ°¿ô¡¦Ê¸»úÎó¤Ê¤É¤Î¥Ç¡¼¥¿¤È Ʊ¤¸¤è¤¦¤Ë°·¤¦¤³¤È¤¬¤Ç¤¤ë¡¥¤¹¤Ê¤ï¤Á¡¤¤¢¤ë´Ø¿ô¤ò¡¤ ¾¤Î´Ø¿ô¤Ø¤Î°ú¿ô¤È¤·¤ÆÅϤ·¤¿¤ê¡¤ÁȤʤɤΥǡ¼¥¿¹½Â¤¤Ë ³ÊǼ¤·¤¿¤ê¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡¥¤³¤Î¤³¤È¤ò¡ÖObjective Caml ¤Ç¤Ï´Ø¿ô¤ÏÂè°ìµé¤ÎÃÍ(first-class value)¤Ç¤¢¤ë¡×¤È¤¤¤¤¡¤¤Þ¤¿´Ø¿ô¤ò°ú¿ô/ÊÖ¤êÃͤȤ¹¤ë ¤è¤¦¤Ê´Ø¿ô¤ò¹â³¬´Ø¿ô(higher-order function)¤È¸Æ¤Ö¡¥
¤Þ¤º¡¤Á°¾Ï¤ÎÉü½¬¤ò¤«¤Í¤Æ¡¤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) ¤Ï¡¤É¬¤º¤·¤â´ØÏ¢¤·¤Æ¤¤¤Ê¤¤Ê̤λÅÁÈ¤ß¤Ç ¤¢¤ë¤³¤È¤¬¤ï¤«¤ë¡¥
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 –
¹â³¬´Ø¿ô¤Î͸ú¤ÊÎã¤È¤·¤Æ¡¤ÊýÄø¼°¤Î¶á»÷²ò¤òµá¤á¤ë Newton-Raphson Ë¡ ¤ò¥×¥í¥°¥é¥à¤·¤Æ¤ß¤è¤¦¡¥Newton-Raphson Ë¡¤Ï¡¤Èùʬ²Äǽ¤Ê´Ø¿ô f ¤Ë ÂФ·¤Æ¡¤ÊýÄø¼° f(x) = 0 ¤Î²ò¤òµá¤á¤ëÊýË¡¤Ç¤¢¤ê¡¤
| g(x) = x − |
|
¤ÎÉÔÆ°ÅÀ (g(a) = a ¤Ê¤ë a) ¤òµá¤á¤ë¡¥(¤â¤·¤¯¤Ï Á²²½¼° xn = xn−1 − f(xn−1) / f'(xn−1) ¤Î ¶Ë¸Â¤òµá¤á¤ë¡¥)
¤³¤ì¤ò²ò¤¯¥×¥í¥°¥é¥à¤ò¹Í¤¨¤Æ¤ß¤è¤¦¡¥¤Þ¤º¡¤Èùʬ¤ò¤É¤¦É½¸½¤¹¤ë¤«¤Ç¤¢¤ë¤¬¡¤ ¶á»÷Ū¤Ë¡¤¤È¤Æ¤â¾®¤µ¤¤Äê¿ô dx ¤ËÂФ·¤Æ
| g'(x) = |
|
¤È¤·¤è¤¦¡¥Èùʬ¤òµá¤á¤ë´Ø¿ô¤Ï¡¤¼«Á³¤Ë¼¡¤Î¤è¤¦¤Ê¹â³¬´Ø¿ô¤È¤·¤ÆÄêµÁ¤Ç¤¤ë¡¥
# 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
¶á»÷Ū¤Ê·×»»ÊýË¡¤È¤·¤Æ¡¤¤³¤³¤Ç¤ÏÂæ·Á¶á»÷¤òÀâÌÀ¤¹¤ë¤¬Â¾¤ÎÊýË¡¤Ç¤âÎɤ¤¡¥ Âæ·Á¸ø¼°¤Ç¤Ï b−a ¤ò n ʬ³ä¤·¤¿¶è´Ö¤ÎŤµ¤ò δ ¤È¤·¤Æ¡¤Âæ·Á¤Î½¸¤Þ¤ê¤È¤·¤Æ ·×»»¤¹¤ë¡¥iÈÖÌܤζè´Ö¤ÎÂæ·Á¤ÎÌÌÀѤÏ
|
¤È¤·¤Æµá¤á¤é¤ì¤ë¡¥
¤¤¤í¤¤¤í¤Ê´Ø¿ô¤ò½ñ¤¤¤Æ¤¤¤¯¤È¡¤°ú¿ô¤Î·¿¤Ë´Ø¤ï¤é¤ºÆ±¤¸¤³¤È¤ò¤¹¤ë´Ø¿ô¤¬½Ð ¸½¤¹¤ë¾ì¹ç¤¬¤·¤Ð¤·¤Ð¸½¤ì¤ë¡¥Î㤨¤Ð¡¤Æó¤ÄÁȤ«¤éÂè°ìÍ×ÁǤò¼è½Ð¤¹´Ø¿ô¤ò ¹Í¤¨¤Æ¤ß¤è¤¦¡¥Î㤨¤Ð¡¤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) ¤È¤¤¤Ã¤¿¤â¤Î¤¬¤¢¤ë¡¥
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)¤È¤¤¤¦¡¥
¤µ¤Æ¡¤¤³¤ì¤Þ¤Ç 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 ¤ÎÉôʬ¤Ç¥¨¥é¡¼ ¤¬Êó¹ð¤µ¤ì¤ë¡¥
¡Ö·×»»¡×¤È¤¤¤¦³µÇ°¤Î¥â¥Ç¥ë¤È¤·¤Æ´ðËÜŪ¤Ê¤â¤Î¤Ë¥Á¥å¡¼¥ê¥ó¥°µ¡³£¤¬¤¢¤ë¡¥ ¥Á¥å¡¼¥ê¥ó¥°µ¡³£¤Ï¡¤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
(ÉÔÆ°ÅÀ¥³¥ó¥Ó¥Í¡¼¥¿¤òƳÆþ¤·¤¿)¥³¥ó¥Ó¥Í¡¼¥¿¡¤(·¿¤Ê¤·¤Î) λ·×»»¤Ï¥Á¥å¡¼¥ê¥ó¥°µ¡³£¤ÈÆ±ÄøÅÙ¤Îɽ¸½ÎϤ¬¤¢¤ë ·×»»¥â¥Ç¥ë¤Ç¤¢¤ë¤³¤È¤¬ÃΤé¤ì¤Æ¤¤¤ë¡¥
# 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
# 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;;
# 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>
¤Þ¤¿¡¤fun x y -> y ¤ÈƱÍÍ¤ËÆ¯¤¯´Ø¿ô¤ò¡¤¥³¥ó¥Ó¥Í¡¼¥¿ s ¤È k ¤ò ´Ø¿ôŬÍѤΤߤÇ(fun ¤ä let ¤Ë¤è¤ë´Ø¿ôÄêµÁ¤ò»È¤ï¤º¤Ë) ÁȤ߹ç¤ï¤»¤¿·Á¤Çɽ¸½¤»¤è¡¥
# ( (* s, k ¤ò ´Ø¿ôŬÍѤÇÁȤ߹ç¤ï¤»¤¿¼° *) ) 1 2;; - : int = 2
¤³¤ì¤Þ¤Ç¡¤¹½Â¤¤Î¤¢¤ë¥Ç¡¼¥¿¤òɽ¸½¤¹¤ë¤¿¤á¤Î¼êÃʤȤ·¤Æ¤ÏÁÈ ¤òÍѤ¤¤Æ¤¤¿¡¥¤³¤³¤Ç¤Ï¥ê¥¹¥È(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 = ...
¥ì¥³¡¼¥É·¿¤ä¥ô¥¡¥ê¥¢¥ó¥È·¿¤Ï¡¤ÁÈ·¿¡¤¥ê¥¹¥È·¿¤ÈƱÍͤˡ¤¤½¤Î¤è¤¦¤Ê̾Á°¤Î°ì¤Ä ¤Î·¿¤¬Â¸ºß¤¹¤ë¤ï¤±¤Ç¤Ï¤Ê¤¯¡¤¹½Â¤¤Î¤¢¤ë¥Ç¡¼¥¿¤òƳÆþ¤¹¤ë¤¿¤á¤Î¡¤»÷¤¿¤è¤¦ ¤Ê¹½Â¤¤ò»ý¤Ã¤¿·¿¤Î¼ïÎà¤Ç¤¢¤ë¡¥¥ì¥³¡¼¥É¤ÏÁÈ¤ÈÆ±Íͤˤ¤¤¯¤Ä¤«¤Î Ãͤòʤ٤뤳¤È¤Ç¹½À®¤µ¤ì¤ë¥Ç¡¼¥¿¤Ç¤¢¤ë¤Î¤ËÂФ·¡¤ ¥ô¥¡¥ê¥¢¥ó¥È¤Ï°Û¤Ê¤ë¼ïÎà¤ÎÃͤòƱ¤¸·¿¤ÎÃͤȤ·¤Æº®¤¼¤Æ°·¤¦¤¿¤á¤Î¤â¤Î¤Ç¤¢¤ë¡¥ ¤³¤ì¤é¤Ï¡¤¤½¤ì¤¾¤ì C ¸À¸ì¤Î¹½Â¤ÂÎ(struct)¤È¶¦ÍÑÂÎ(union)¤Ë¶á¤¤¡¥ ¤Þ¤¿¡¤¥ô¥¡¥ê¥¢¥ó¥È·¿¤Ï¥ê¥¹¥È¤Ê¤É¤ÎºÆµ¢Åª¤Ê¹½Â¤¤ò»ý¤Ä¥Ç¡¼¥¿¹½Â¤¤òƳÆþ¤¹¤ë¤¿¤á ¤Ë»È¤ï¤ì¤ë¡¥¤É¤Á¤é¤â¡¤»ÈÍѤ¹¤ë¤¿¤á¤Ë¤Ï¥×¥í¥°¥é¥Þ¤¬¶ñÂÎŪ¤Ê·¿¤Î¹½Â¤¤òÀë¸À¤ò¤¹¤ë ɬÍפ¬¤¢¤ë¡¥ÌäÂêÎΰè¤Ë±þ¤¸¤ÆÅ¬Àڤʥǡ¼¥¿·¿¤ò¥Ç¥¶¥¤¥ó¡¦ÄêµÁ¤¹¤ë¤³¤È¤Ï (Objective Caml¤Ë¸Â¤é¤º)¥×¥í¥°¥é¥ß¥ó¥°¤Ë¤ª¤¤¤ÆÈó¾ï¤Ë½ÅÍפʵ»½Ñ¤Ç¤¢¤ë¡¥
¥ì¥³¡¼¥É·¿¤ÎÃͤϡ¤ÁÈ¤ÈÆ±Íͤˡ¤ËܼÁŪ¤Ë¤ÏÃͤò¤¤¤¯¤Ä¤«Ê¤٤¿¤â¤Î¤Ç¤¢¤ë¡¥ ÁȤȤΰ㤤¤Ï¡¤¤½¤ì¤¾¤ì¤ÎÍ×ÁǤË̾Á°¤òÍ¿¤¨¤Æ¡¤¤½¤Î̾Á°¤Ç¥ì¥³¡¼¥É¤ÎÍ×ÁÇ ¤Ë¥¢¥¯¥»¥¹¤Ç¤¤ë¤³¤È¤Ç¤¢¤ë¡¥¤³¤Î̾Á°¤ÈÃͤÎÁȤò¥Õ¥£¡¼¥ë¥É(field)¡¤ ¥Õ¥£¡¼¥ë¥É¤Î̾Á°¤ò¥Õ¥£¡¼¥ë¥É̾¡¤¤È¸Æ¤Ö¡¥
Î㤨¤Ð¡¤³ØÀ¸¤Î¥Ç¡¼¥¿¥Ù¡¼¥¹¤òºî¤ë¤³¤È¤ò¹Í¤¨¤è¤¦¡¥³ØÀ¸°ì¿Í°ì¿Í¤Î¥Ç¡¼¥¿¤Ï ̾Á°¤òɽ¤¹ name ¥Õ¥£¡¼¥ë¥É¡¤³ØÀ¸¾ÚÈÖ¹æ¤òɽ¤¹ id ¥Õ¥£¡¼¥ë¥É¤ÎÊÂ¤Ó¤È ¤¹¤ë¡¥¿·¤·¤¤¥ì¥³¡¼¥É·¿¤Ï¡¤type Àë¸À¤ò¤Ä¤«¤Ã¤ÆÄêµÁ¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡¥
# type student = {name : string; id : int};;
type student = name : string; id : int;
student ¤¬¿·¤·¤¤·¿¤Î¼±Ê̻ҤǤ¢¤ë¡¥°ìÈÌŪ¤Ë¤Ï¡¤ ³Æ¥Õ¥£¡¼¥ë¥É¤Ë³ÊǼ¤µ¤ì¤ëÃͤη¿¤ò¥Õ¥£¡¼¥ë¥É̾¤È¤È¤â¤Ëʤ١¤{} ¤Ç °Ï¤à¤³¤È¤Ç¥ì¥³¡¼¥É·¿¤ò¼¨¤¹¡¥
type ⟨ ·¿Ì¾ ⟩ = {⟨ ¥Õ¥£¡¼¥ë¥É̾1 ⟩ : ⟨ ·¿1 ⟩; ...; ⟨ ¥Õ¥£¡¼¥ë¥É̾n ⟩ : ⟨ ·¿n ⟩}
ÄêµÁ¤µ¤ì¤¿¥ì¥³¡¼¥É¤ÎÃͤϡ¤
{⟨ ¥Õ¥£¡¼¥ë¥É̾1 ⟩ = ⟨ ¼°1 ⟩; ...; ⟨ ¥Õ¥£¡¼¥ë¥É̾n ⟩ = ⟨ ¼°n ⟩}
¤Ç¹½À®¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡¥1
# let st1 = {name = "Taro Yamada"; id = 123456};;
val st1 : student = name = "Taro Yamada"; id = 123456
¥ì¥³¡¼¥É¤ÎÍ×ÁǤϡ¤ÁÈ¤ÈÆ±Íͤ˥ѥ¿¡¼¥ó¥Þ¥Ã¥Á¤Ç¥¢¥¯¥»¥¹¤¹¤ë ÊýË¡¤È¡¤¥Õ¥£¡¼¥ë¥É¤Ò¤È¤Ä¤ÎÃͤΤߤò¥É¥Ã¥ÈµË¡¤È¸Æ¤Ð¤ì¤ëÊýË¡¤Ç ¥¢¥¯¥»¥¹¤¹¤ëÊýË¡¤¬¤¢¤ë¡¥¥ì¥³¡¼¥É¥Ñ¥¿¡¼¥ó¤Ï¡¤
{⟨ ¥Õ¥£¡¼¥ë¥É̾1 ⟩ = ⟨ ¥Ñ¥¿¡¼¥ó1 ⟩; ...; ⟨ ¥Õ¥£¡¼¥ë¥É̾n ⟩ = ⟨ ¥Ñ¥¿¡¼¥ón ⟩}
¤È¤¤¤¦·Á¤Çɽ¤µ¤ì¤ë¡¥
# let string_of_student {name = n; id = i} = n ^ "'s ID is " ^ string_of_int i;;
val string_of_student : student -> string = <fun>
# string_of_student st1;;
- : string = "Taro Yamada's ID is 123456"
¤Þ¤¿¤Ï ⟨ ¥ì¥³¡¼¥É ⟩.⟨ ¥Õ¥£¡¼¥ë¥É̾ ⟩ ¤È¤¤¤¦·Á¤Ç ⟨ ¥ì¥³¡¼¥É ⟩¤«¤é⟨ ¥Õ¥£¡¼¥ë¥É̾ ⟩¤ËÂбþ¤¹¤ëÍ×ÁǤò¼è¤ê½Ð¤¹¤³¤È¤¬ ¤Ç¤¤ë¡¥
# let string_of_student st = st.name ^ "'s ID is " ^ string_of_int st.id;; val string_of_student : student -> string = <fun>
¤Þ¤¿¥ì¥³¡¼¥É¤Î°ìÉô¤Î¥Õ¥£¡¼¥ë¥É¤òÊѹ¹¤·¤¿¤À¤±¤Î¿·¤·¤¤¥ì¥³¡¼¥É¤ò À¸À®¤·¤¿¤¤¾ì¹ç¤Ë¤Ï¡¤
{⟨ ¥ì¥³¡¼¥É¼° ⟩ with
⟨ ¥Õ¥£¡¼¥ë¥É̾1 ⟩ = ⟨ ¼°1 ⟩; ...; ⟨ ¥Õ¥£¡¼¥ë¥É̾n ⟩ = ⟨ ¼°n ⟩}
¤È¤¤¤¦¼°¤Ç¤Ç¤¤ë¡¥Ä¹¤¤¥ì¥³¡¼¥É¤Î°ìÉô¤À¤±Êѹ¹¤·¤¿¤¤¤È¤¤ËÊØÍø¤Ç¤¢¤ë¡¥
# type teacher = {tname : string; room : string; ext : int};;
type teacher = tname : string; room : string; ext : int;
# let t1 = {tname = "Atsushi Igarashi"; room = "140"; ext = 4953};;
val t1 : teacher = tname = "Atsushi Igarashi"; room = "140"; ext = 4953
# let t2 = {t1 with room = "142"};;
val t2 : teacher = tname = "Atsushi Igarashi"; room = "142"; ext = 4953
¤³¤Î»þ¡¤µ¤¤ò¤Ä¤±¤Ê¤±¤ì¤Ð¤¤¤±¤Ê¤¤¤Î¤¬¡¤with ¤Ï¥Õ¥£¡¼¥ë¥É¤Î¹¹¿· ¤ò¹Ô¤¦¤Î¤Ç¤Ï¤Ê¤¯¡¤¿·¤·¤¤¥ì¥³¡¼¥É¤òÀ¸À®¤·¤Æ¤¤¤ë¤È¤¤¤¦¤³¤È¤Ç¤¢¤ë¡¥t1 ¤¬Â«Çû ¤µ¤ì¤¿¥ì¥³¡¼¥É¤Î room ¥Õ¥£¡¼¥ë¥É¤ÎÃÍ¤Ï t2 ¤ÎÄêµÁ¸å¤âÊѤäƤ¤¤Ê¤¤¡¥ ¤Ä¤Þ¤ê¡¤
# t1;; - : teacher = tname = "Atsushi Igarashi"; room = "140"; ext = 4953
t1 ¤ÎÃͤÏt2¤ÎÄêµÁÁ°¸å¤ÇÊѲ½¤·¤Ê¤¤¡¥
¥ì¥³¡¼¥É·¿¤¬ÁÈ·¿¤È°ã¤¦ÅÀ¤Ï¡¤³ÆÍ×ÁǤË̾Á°¤¬¤Ä¤¡¤¤½¤Î̾Á°¤Ç¥Ñ¥¿¡¼¥ó¥Þ¥Ã¥Á¤ò ²ð¤µ¤ºÍ×ÁǤ˥¢¥¯¥»¥¹¤Ç¤¤ë¤³¤È¡¤°ìÉô¤ÎÍ×ÁǤÀ¤±¤òÊѹ¹¤·¤¿¥ì¥³¡¼¥É¤òÍÆ°× ¤Ëºî¤ë¤³¤È¤¬¤Ç¤¤ë¤³¤È¤Î¾¤Ë¡¤·¿Àë¸À¤ò¤·¤Ê¤¤¤È»È¤¨¤Ê¤¤¤È¤¤¤¦¤³¤È¤¬¤¢¤ë¡¥ ¤Þ¤¿¡¤¥ì¥³¡¼¥É·¿¤Ï¾ï¤Ë̾Á°¤Ç»²¾È¤µ¤ì¡¤{...} ¤È¤¤¤¦É½¸½¤Ï·¿¤½¤Î¤â¤Î¤È¤·¤Æ¤Ï »È¤¨¤Ê¤¤¡¥¤Ä¤Þ¤ê¡¤°ú¿ô¤Î·¿¤È¤·¤Æ
let f (x : {name : string; id : int}) = ...
¤È¤·¤¿¤ê¡¤Æþ¤ì»Ò¤Ë¤Ê¤Ã¤¿¥ì¥³¡¼¥É¤òÀë¸À¤¹¤ë¤Î¤Ë¡¤
type student_teacher =
{s : {name : string; id : int};
t : {tname : string; room : string; ext : int}};;
¤ÈÀë¸À¤¹¤ë¤³¤È¤Ï¤Ç¤¤Ê¤¤¡¥Àµ¤·¤¯¤ÏÆâ¦¤Î¥ì¥³¡¼¥É·¿¤òÀë¸À¤·¤Æ¤ª¤¤¤Æ¡¤
# type student_teacher = {s : student; t : teacher};;
type student_teacher = s : student; t : teacher;
¤È¹Ô¤¦¡¥¤¿¤À¤·¡¤¥Í¥¹¥È¤·¤¿¥ì¥³¡¼¥É¤ÎÃͤä¥Ñ¥¿¡¼¥ó¤ÏľÀܹ½À®²Äǽ¤Ç¤¢¤ë¡¥
# let st = {s = {name = "Taro Yamada"; id = 123456}; t = t1};;
val st : student_teacher =
s = name = "Taro Yamada"; id = 123456;
t = tname = "Atsushi Igarashi"; room = "140"; ext = 4953
·¿Ì¾¡¦¥Õ¥£¡¼ ¥ë¥É̾¤Ë»ÈÍѤǤ¤ë¤Î¤ÏÊÑ¿ô̾¤Ë»ÈÍѤǤ¤ë¤Î¤ÈƱÍͤÊʸ»úÎó¤Ç¤¢¤ë¡¥¥Õ¥£¡¼¥ë¥É ̾¤Ï type Àë¸À¤Ç¥ì¥³¡¼¥É·¿¤òÀë¸À¤¹¤ë¤³¤È¤Ç¡¤¤Ï¤¸¤á¤Æ»ÈÍѤ¹¤ë¤³¤È¤¬¤Ç¤¤ë¡¥ Ʊ¤¸¥Õ¥£¡¼¥ë¥É̾¤ò»ý¤ÄÊ̤η¿¤òÀë¸À¤¹¤ë¤È¡¤ÊÑ¿ô¤ÎºÆÀë¸À¤ÈƱÍÍ¡¤¸Å¤¤¥Õ¥£¡¼¥ë ¥É̾¤ÎÄêµÁ¤Ï±£¤µ¤ì¤Æ¤·¤Þ¤¦¤Î¤ÇÃí°Õ¤¬É¬ÍפǤ¢¤ë¡¥¤Ä¤Þ¤ê¡¤
# type foo = {name : bool};;
type foo = name : bool;
¤Ê¤É¤È name ¥Õ¥£¡¼¥ë¥É¤ò»ý¤ÄÊ̤Υ쥳¡¼¥É·¿¤òÀë¸À¤·¤Æ¤·¤Þ¤¦¤È¡¤¿·¤¿¤Ë student ¤ÎÃͤò¹½À®¤·¤¿¤ê¡¤name ¥Õ¥£¡¼¥ë¥É¤Ë¥¢¥¯¥»¥¹¤Ê¤É¤¬¤Ç¤¤Ê¤¯ ¤Ê¤Ã¤Æ¤·¤Þ¤¦¡¥
# {name = "Ichiro Suzuki"; id = 51};;
name = "Ichiro Suzuki"; id = 51;;
^^^^^^^^^^^^^^^
This expression has type string but is here used with type bool
# st1.name;;
st1.name;;
^^^
This expression has type student but is here used with type foo
¤¿¤À¤·¡¤ÊÑ¿ô̾¡¤¥Õ¥£¡¼¥ë¥É̾¡¤·¿Ì¾¤ÏÊ̤Î̾Á°¶õ´Ö(name space)¤Ë°¤· ¤Æ¤¤¤ë¤Î¤Ç¡¤Î㤨¤Ð¡¤Àë¸ÀºÑ¤Î¥Õ¥£¡¼¥ë¥É̾¤ÈƱ¤¸ÊÑ¿ô¤òÍѤ¤¤Æ¤â¡¤¥Õ¥£¡¼¥ë¥É̾¤¬ ±£¤µ¤ì¤¿¤ê¤¹¤ë¤³¤È¤Ï¤Ê¤¤¡¥
¥ô¥¡¥ê¥¢¥ó¥È·¿¤¬²¿¤«¤òÀâÌÀ¤¹¤ëÁ°¤Ë¡¤Æ°µ¡ÉÕ¤±¤ÎÎã¤È¤·¤Æ¡¤ ÍÍ¡¹¤Ê¿Þ·Á¤Î¥Ç¡¼¥¿¤ò°·¤¦¤³¤È¤ò¹Í¤¨¤Æ¤ß¤è¤¦¡¥°·¤¦¤Î¤Ï°Ê²¼¤Î4¼ïÎà¤Î¿Þ·Á ¤Ç¡¤¤½¤ì¤¾¤ì·Á¾õ¤ò·èÄꤹ¤ë¤¿¤á¤Î¥Ç¡¼¥¿¤ò¤â¤Ä¤È¤¹¤ë¡¥
¤³¤³¤Ç¡¤¤³¤Î¤è¤¦¤Ê¿Þ·Á¥Ç¡¼¥¿¤ò°·¤ª¤¦¤È¤¹¤ë¤È¡¤
¤È¤¤¤¦ÌäÂ꤬¤¢¤ë¡¥¥ô¥¡¥ê¥¢¥ó¥È·¿¤Ï¤³¤Î¤è¤¦¤Ë¡¤°Û¤Ê¤ë¥Ç¡¼¥¿(ɽ¸½¤¬Æ±¤¸¤Ç¤â °ÕÌ£¤¬°Û¤Ê¤ë¾ì¹ç¤â´Þ¤á¤Æ)¤òº®¤¼¤Æ¡¤°ì¤Ä¤Î·¿¤È¤·¤Æ°·¤¤¤¿¤¤ºÝ¤Ë»È¤¦¤â¤Î¤Ç¡¤¤Ò ¤È¤Ä¤Ò¤È¤Ä¤ÎÃͤϡ¤¥Ç¡¼¥¿¤ÎËÜÂÎ((2, 4) ¤ä 8 ¤Ê¤É)¤Ë¡¤¤½¤Î¥Ç¡¼¥¿¤Ï¤Ê¤Ë¤ò ɽ¤¹¤¿¤á¤Î¤â¤Î¤«(±ß¡¤Ä¹Êý·Á¡¤ÀµÊý·Á)¤Î¾ðÊó¤òÉղä·¤¿¤â¤Î¤Çɽ¤µ¤ì¤ë¡¥
¤Ç¤Ï¡¤¿Þ·Á¤òɽ¤¹¥ô¥¡¥ê¥¢¥ó¥È·¿¤òÄêµÁ¤·¤Æ¤ß¤è¤¦¡¥
# type figure =
Point
| Circle of int
| Rectangle of int * int
| Square of int;;
type figure = Point | Circle of int | Rectangle of int * int | Square of int
¥ô¥¡¥ê¥¢¥ó¥È·¿¤â¥ì¥³¡¼¥É·¿¤ÈƱÍÍ type ¤ò»È¤Ã¤ÆÀë¸À¤¹¤ë¡¥figure ¤Ï¿·¤·¤¤·¿¤Î̾Á°¤Ç¤¢¤ë¡¥Point, Circle, Rectangle, Square ¤Ï¥³¥ó¥¹¥È¥é¥¯¥¿(constructor)¤È¸Æ¤Ð¤ì¡¤¾å¤Ç½Ò¤Ù¤¿¡Ö¤½¤Î¥Ç¡¼ ¥¿¤Ï²¿¤òɽ¤¹¤¿¤á¤Î¤â¤Î¤«¡×¤È¤¤¤¦¾ðÊó¤ËÁêÅö¤¹¤ë¡¥of ¤Î¸å¤Ë¤Ï¡¤¥³¥ó¥¹ ¥È¥é¥¯¥¿¤¬Éղ䵤ì¤ëÃͤη¿¤òµ½Ò¤¹¤ë¡¥ of °Ê²¼¤Ï¾Êά²Äǽ¤Ç¡¤¾Êά¤·¤¿ ¾ì¹ç¥³¥ó¥¹¥È¥é¥¯¥¿Ã±ÆÈ¤Ç¤½¤Î·¿¤ÎÃͤȤʤ롥(¤³¤ÎÎã¤Ç¤Ï¡¤ÅÀƱ»Î¤Ï ¶èÊ̤¹¤ëɬÍפ¬¤Ê¤¤¤Î¤Ç0°ú¿ô¥³¥ó¥¹¥È¥é¥¯¥¿¤È¤·¤ÆÀë¸À¤·¤Æ¤¤¤ë¡¥) ¥ô¥¡¥ê¥¢¥ó¥È·¿¤ÎÃͤϡ¤¥³¥ó¥¹¥È¥é¥¯¥¿¤ò´Ø¿ô¤Î¤è¤¦¤ËÂбþ¤¹¤ë·¿¤ÎÃÍ¤Ë ¡ÖŬÍѡפ¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¹½À®¤µ¤ì¤ë¡¥
# let c = Circle 3;; val c : figure = Circle 3 # let figs = [Point; Square 5; Rectangle (4, 5)];; val figs : figure list = [Point; Square 5; Rectangle (4, 5)]
¼¡¤Ë¡¤Í¿¤¨¤é¤ì¤¿¿Þ·Á¤ÎÌÌÀѤòµá¤á¤ë´Ø¿ô¤ò¹Í¤¨¤Æ¤ß¤è¤¦¡¥¤Þ¤º¤Ï¡¤¿Þ·Á¤¬ ¤É¤Î¼ïÎà¤Î¤â¤Î¤Ç¤¢¤ë¤«¤òÄ´¤Ù¤Æ¡¤¤½¤ì¤Ë¤è¤Ã¤Æ¾ì¹ç¤ï¤±¤ò¤¹¤ëɬÍפ¬¤¢¤ë¡¥ ¤³¤Î¾ì¹ç¤ï¤±¤Ï match¼°¤Ç¹Ô¤¦¤³¤È¤¬¤Ç¤¤ë¡¥¥ô¥¡¥ê¥¢¥ó¥È·¿¤ÎÃͤËÂФ¹¤ë ¥Ñ¥¿¡¼¥ó¤Ï
⟨ ¥³¥ó¥¹¥È¥é¥¯¥¿ ⟩ ⟨ ¥Ñ¥¿¡¼¥ó ⟩
¤È¤¤¤¦·Á¤Ç¡¤¥³¥ó¥¹¥È¥é¥¯¥¿¤¬Å¬ÍѤµ¤ì¤¿Ãͤ¬⟨ ¥Ñ¥¿¡¼¥ó ⟩¤Ë ¥Þ¥Ã¥Á¤¹¤ë¤³¤È¤Ë¤Ê¤ë¡¥⟨ ¥Ñ¥¿¡¼¥ó ⟩¤¬¾Êά¤µ¤ì¤¿¾ì¹ç¤Ë¤Ï °ú¿ô¤Î¤Ê¤¤¥³¥ó¥¹¥È¥é¥¯¥¿¤Ë¥Þ¥Ã¥Á¤¹¤ë¤³¤È¤Ë¤Ê¤ë¡¥
# let area = function
Point -> 0
| Circle r -> r * r * 3 (* elementary school approximation :-) *)
| Rectangle (lx, ly) -> lx * ly
| Square l -> l * l;;
val area : figure -> int = <fun>
°ú¿ô¤ËÂФ·¤¹¤°¤Ë¥Þ¥Ã¥Á¥ó¥°¤ò¹Ô¤¦¤Î¤Ç¡¤function ¤ò»ÈÍѤ·¤Æ¤¤¤ë¡¥(Âè5¾Ï»²¾È)
# area c;; - : int = 27 # map area figs;; - : int list = [0; 25; 20]
¥ô¥¡¥ê¥¢¥ó¥È·¿¤ËÂФ¹¤ë¥Ñ¥¿¡¼¥ó¥Þ¥Ã¥Á¤Ç¤Ï¡¤´ðËÜŪ¤Ë¥³¥ó¥¹¥È¥é¥¯¥¿¤Î ¿ô¤À¤±¾ì¹çʬ¤±¤ò¤«¤«¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤¬¡¤¤¤¤¯¤Ä¤«¤Î¾ì¹ç¤Ç½èÍý¤¬ ¶¦Ä̤·¤Æ¤¤¤ë¾ì¹ç¤Ë¤Ï or ¥Ñ¥¿¡¼¥ó ¤È¸Æ¤Ð¤ì¤ë¥Ñ¥¿¡¼¥ó¤Ç ¤Þ¤È¤á¤ë¤³¤È¤¬¤Ç¤¤ë¡¥¼¡¤Î´Ø¿ô¤Ï¡¤Í¿¤¨¤é¤ì¤¿¿Þ·Á¤ò°Ï¤à¤³¤È¤¬¤Ç¤¤ë ÀµÊý·Á¤òÊÖ¤¹´Ø¿ô¤Ç¤¢¤ë¡¥(ĹÊý·Á¤ÏºÇ½é¤ÎÊÕ¤¬Ã»ÊդȲ¾Äꤹ¤ë¡¥)
# let enclosing_square = function
Point -> Square 1
| Circle r -> Square (r * 2)
| Rectangle (_, l) | Square l -> Square l;;
val enclosing_square : figure -> figure = <fun>
Rectangle (_, l) | Square l ¤¬ or ¥Ñ¥¿¡¼¥ó¤È¸Æ¤Ð¤ì¤ë¤â¤Î¤Ç¡¤ °ìÈÌŪ¤Ë¤Ï
⟨ ¥Ñ¥¿¡¼¥ó1 ⟩ | ⟨ ¥Ñ¥¿¡¼¥ó2 ⟩
¤È½ñ¤«¤ì¡¤¤É¤Á¤é¤«¤Ë¥Ñ¥¿¡¼¥ó¤Ë¥Þ¥Ã¥Á¤¹¤ë¤â¤Î¤¬Á´ÂΤ˥ޥåÁ¤¹¤ë¡¥ ³ÆÉôʬ¥Ñ¥¿¡¼¥ó¤ÇƳÆþ¤µ¤ì¤ëÊÑ¿ô(·²)¤Ï¡¤ (¤É¤Á¤é¤Î¥Ñ¥¿¡¼¥ó¤Ë¥Þ¥Ã¥Á¤·¤Æ¤â-> °Ê¹ß¤Î½èÍý¤¬¤¦¤Þ¤¯¤¤¤¯¤è¤¦¤Ë) Ʊ¤¸Ì¾Á°/·¿¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¤Þ¤¿¡¤Ê£¿ô¤ÎÃͤËÂФ·¤Æ¥Þ¥Ã¥Á¤ò¤È¤ë¤È¤¤Ë¤ÏÁȤòÍøÍѤ·¤Æ ¥Þ¥Ã¥Á¤ò¤È¤ë¤Î¤¬¤è¤¤¡¥¼¡¤Î´Ø¿ô¤Ï¡¤Æó¤Ä¤Î¿Þ·Á¤¬Áê»÷¤Ç¤¢¤ë¤«¤ò ȽÄꤹ¤ë´Ø¿ô¤Ç¤¢¤ë¡¥or ¥Ñ¥¿¡¼¥ó¤È¡¤ÁȤÎÍøÍÑË¡¤ËÃí°Õ¡¥
# let similar x y =
match (x, y) with
(Point, Point) | (Circle _, Circle _) | (Square _, Square _) -> true
| (Rectangle (l1, l2), Rectangle (l3, l4)) -> (l3 * l2 - l4 * l1) = 0
| _ -> false;;
val similar : figure -> figure -> bool = <fun>
# similar (Rectangle (2, 4)) (Rectangle (1, 2));;
- : bool = true
¥³¥ó¥¹¥È¥é¥¯¥¿¤Î̾Á°¤Ï¡¤ÊÑ¿ô̾¡¤·¿Ì¾¤È°ã¤Ã¤Æ¡¤°ìʸ»úÌܤ¬±ÑÂçʸ»ú¤Ç¤Ê¤±¤ì¤Ð ¤Ê¤é¤Ê¤¤¡¥¤è¤êÀµ³Î¤Ë¤Ï
¤Ç¤¢¤ë¤è¤¦¤ÊǤ°Õ¤ÎŤµ¤Îʸ»úÎó¤Ç¤¢¤ë¡¥
¥³¥ó¥¹¥È¥é¥¯¥¿¤â¥ì¥³¡¼¥É·¿¤Î¥Õ¥£¡¼¥ë¥É̾¤ÈƱ¤¸¤è¤¦¤Ë¡¤Æ±¤¸Ì¾Á°¤Î¤â¤Î¤ò ºÆÀë¸À¤·¤Æ¤·¤Þ¤¦¤È¡¤Á°¤ËÄêµÁ¤µ¤ì¤¿¥³¥ó¥¹¥È¥é¥¯¥¿¤òȼ¤¦·¿¤Ï»È¤¤Êª¤Ë ¤Ê¤é¤Ê¤¯¤Ê¤Ã¤Æ¤·¤Þ¤¦¤Î¤ÇÃí°Õ¤¹¤ë¤³¤È¡¥
Pascal, C, C++ ¤ÎÎóµó·¿(enum ·¿)¤Ï°ú¿ô¤ò¼è¤é¤Ê¤¤¥³¥ó¥¹¥È ¥é¥¯¥¿¤À¤±¤«¤é¤Ê¤ë¥ô¥¡¥ê¥¢¥ó¥È·¿¤Çɽ¸½¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡¥
# type color = Black | Blue | Red | Magenta | Green | Cyan | Yellow | White;; type color = Black | Blue | Red | Magenta | Green | Cyan | Yellow | White
enum ¤ÎÃͤ¬¼Â¤ÏÀ°¿ô¤Ç¤·¤«¤Ê¤¤ C ¤È¤Ï°ã¤¤¡¤¥³¥ó¥¹¥È¥é¥¯¥¿Æ±»Î¤Î¤·»»¤Ê¤É¤Ï ÅöÁ³ÄêµÁ¤µ¤ì¤Ê¤¤¡¥(¤½¤¦¤¤¤¦´Ø¿ô¤ò½ñ¤«¤Ê¤¤¸Â¤ê¡¥)¤³¤Î·¿¾å¤Î´Ø¿ô¤Ï 8¤Ä¤Î¾ì¹ç¤ï¤±¤ò¹Ô¤ï¤Ê¤±¤ì¤Ð¤¤¤±¤Ê¤¤¡¥
# let reverse = function
Black -> White | Blue -> Yellow | Red -> Cyan | Magenta -> Green
| Green -> Magenta | Cyan -> Red | Yellow -> Blue | White -> Black;;
val reverse : color -> color = <fun>
bool·¿¤âÎóµó·¿¤Î°ì¼ï¤È¸«¤Ê¤¹¤³¤È¤¬¤Ç¤¤ë¡¥
type bool = true | false
¤½¤·¤Æ¡¤if¼°¤Ï match¼°¤ÎÊÑ·Á¤È¸«¤Ê¤¹¤³¤È¤¬¤Ç¤¤ë¡¥
if ⟨ ¼°1 ⟩ then ⟨ ¼°2 ⟩ else ⟨ ¼°3 ⟩ ∼ match ⟨ ¼°1 ⟩ with true -> ⟨ ¼°2 ⟩ | false -> ⟨ ¼°3 ⟩
¥³¥ó¥¹¥È¥é¥¯¥¿¤Î̾Á°¤ÎÀ©¸Â¤Ê¤É¤â¤¢¤ë¤¿¤á¡¤¾å¤Î type Àë¸À¤ò¼ÂºÝ¤Ë¹Ô¤Ê ¤¦¤³¤È¤Ï¤Ç¤¤Ê¤¤¤¬¡¤bool·¿¤â³µÇ°Åª¤Ë¤Ï¥ô¥¡¥ê¥¢¥ó¥È·¿¤Î°ì¼ï¤È¹Í¤¨¤ë¤Î ¤ÏÍý²ò¤Î½õ¤±¤Ë¤Ê¤ë¤À¤í¤¦¡¥
¥ô¥¡¥ê¥¢¥ó¥È·¿¤Ï of °Ê²¼¤Ëº£Àë¸À¤·¤è¤¦¤È¤·¤Æ¤¤¤ë·¿Ì¾¤ò»²¾È¤¹¤ë¤³¤È¤Ç ºÆµ¢Åª¤Ê¥Ç¡¼¥¿·¿¤òÄêµÁ¤¹¤ë¤³¤È¤â²Äǽ¤Ç¤¢¤ë¡¥¤³¤³¤Ç¤Ï¡¤¤â¤Ã¤È¤âñ½ã¤ÊºÆ µ¢Åª¥Ç¡¼¥¿¤ÎÎã¤È¤·¤Æ¡¤¼«Á³¿ô¤òɽ¤¹·¿¤ò¹Í¤¨¤Æ¤ß¤è¤¦¡¤¼«Á³¿ô¤Ï°Ê²¼¤Î¤è¤¦ ¤ËºÆµ¢Åª¤ËÄêµÁ¤Ç¤¤ë¡¥
¡Ö¥¼¥í¡×¡Ö1Â礤¤¡×¤È¤¤¤¦Éôʬ¤ò¥³¥ó¥¹¥È¥é¥¯¥¿¤È¤·¤Æ¹Í¤¨¤ë¤È¼¡¤Î¤è¤¦¤Ê ·¿ÄêµÁ¤¬Æ³¤«¤ì¤ë¡¥
# type nat = Zero | OneMoreThan of nat;; type nat = Zero | OneMoreThan of nat # let zero = Zero and two = OneMoreThan (OneMoreThan Zero);; val zero : nat = Zero val two : nat = OneMoreThan (OneMoreThan Zero)
¤³¤Î¼«Á³¿ô¾å¤Ç¤Î²Ã»»¤Ï¡¤¥Ç¡¼¥¿¼«ÂΤκƵ¢ÅªÄêµÁ¤Ë½¾¤Ã¤Æ¡¤
¤ÈÄêµÁ¤Ç¤¤ë¡¥
# let rec add m n =
match m with Zero -> n | OneMoreThan m' -> OneMoreThan (add m' n);;
val add : nat -> nat -> nat = <fun>
# add two two;;
- : nat = OneMoreThan (OneMoreThan (OneMoreThan (OneMoreThan Zero)))
¼Â¤Ï¡¤¤³¤Î¹½Â¤¤Ï¤è¤¯¸«¤Æ¤ß¤ë¤È¡¤¥ê¥¹¥È¤ËÎɤ¯»÷¤Æ¤¤¤ë¤³¤È¤Ëµ¤¤Å¤¯¡¥ ÃúÅÙ Zero ¤Ï¶õ¥ê¥¹¥È []¡¤OneMoreThan ¤Ï cons ¤ËÂбþ¤·¤Æ¤¤¤ë¡¥ ËܼÁŪ¤Ê°ã¤¤¤Ï³ÊǼ¤Ç¤¤ëÍ×ÁǤÎÍ̵¤À¤±¤Ç¤¢¤ë¡¥nat ¤Î¹½Â¤¤ò ³ÈÄ¥¤¹¤ì¤Ð¡¤Î㤨¤Ð¡¤À°¿ô¥ê¥¹¥È¤òɽ¸½¤¹¤ë·¿¤ò´Êñ¤ËÄêµÁ¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡¥
# type intlist = INil | ICons of int * intlist;; type intlist = INil | ICons of int * intlist
(¿ÁêŪ¤Ê¥ê¥¹¥È¤ÎÄêµÁ¤Ï²¼¤Ç¹Ô¤¦¡¥)
¤Þ¤¿¥ô¥¡¥ê¥¢¥ó¥È·¿ÄêµÁ¤Ï¤Õ¤¿¤Ä¤Î·¿ÄêµÁ¤ò and ¤Ç·ë¤Ö¤³¤È¤Ë¤è¤Ã¤Æ¡¤Áê¸ßºÆµ¢Åª¤Ë¤¹¤ë¤³¤È¤â²Äǽ¤Ç¤¢¤ë¡¥ ²¼¤ÎÎã¤Ï¡¤¼Â¿ô¤Èʸ»úÎ󤬸ò¸ß¤Ë¸½¤ì¤ë¥ê¥¹¥È¤òɽ¸½¤·¤¿¤â¤Î¤Ç¤¢¤ë¡¥
# type fl_str_list = FNil | FCons of float * str_fl_list
and str_fl_list = SNil | SCons of string * fl_str_list;;
type fl_str_list = FNil | FCons of float * str_fl_list
and str_fl_list = SNil | SCons of string * fl_str_list
# let fslist = FCons (3.14, SCons ("foo", FCons (2.7, SNil)));;
val fslist : fl_str_list = FCons (3.14, SCons ("foo", FCons (2.7, SNil)))
¤³¤Î·¿¾å¤Î´Ø¿ô¤Ï¼«Á³¤ËÁê¸ßºÆµ¢¤ÎÆó¤Ä¤Î´Ø¿ô¤ÇÄêµÁ¤µ¤ì¤ë¡¥¼¡¤Î´Ø¿ô¤Ï¡¤¤³¤Î2 ¼ïÎà¤Î¥ê¥¹¥È(¼Â¿ô¤«¤é»Ï¤Þ¤ë¤â¤Î¤È¡¤Ê¸»úÎ󤫤é»Ï¤Þ¤ë¤â¤Î)¤ÎŤµ¤ò·×»»¤¹¤ë ´Ø¿ô¤Ç¤¢¤ë¡¥
# let rec length_fs = function
FNil -> 0
| FCons (_, rest_sf) -> 1 + length_sf rest_sf
and length_sf = function
SNil -> 0
| SCons (_, rest_fs) -> 1 + length_fs rest_fs;;
val length_fs : fl_str_list -> int = <fun>
val length_sf : str_fl_list -> int = <fun>
# length_fs fslist;;
- : int = 3
intlist ¤ÈƱÍͤˤ·¤Æ¡¤stringlist ¤Ê¤É¤òÄêµÁ¤·¤Æ¤æ¤¯¤È¡¤ ÄêµÁ¤¬¹ó»÷¤·¤Æ¤¤¤ë¤³¤È¤¬¤ï¤«¤ë¡¥·ë¶É¡¤
¤È¤¤¤¦¹½Â¤¤¬¶¦Ä̤·¤Æ¤¤¤ë¤¿¤á¤Ç¤¢¤ë¡¥¤Þ¤¿°ã¤¤¤ÏÍ×ÁǤη¿¤À¤±¤Ç¤¢¤ë¡¥ Objective Caml ¤Ç¤Ï¡¤Â¿Áê·¿´Ø¿ô¤¬¡¤(³µÇ°Åª¤Ë)´Ø¿ôÃæ¤Î·¿¾ðÊó¤ò¥Ñ¥é¥á¡¼¥¿²½¤¹¤ë¤³¤È¤Ç ÍÍ¡¹¤Ê·¿¤ÎÃͤËŬÍѤǤ¤ë¤Î¤ÈƱÍÍ¡¤·¿ÄêµÁ¤Î°ìÉôʬ¤ò¥Ñ¥é¥á¡¼¥¿²½¤¹¤ë ¤³¤È¤â²Äǽ¤Ç¤¢¤ë¡¥¤¿¤À¤·¡¤´Ø¿ô¤È¤Ï°ã¤¤¡¤·¿¥Ñ¥é¥á¡¼¥¿¤òÌÀ¼¨Åª¤Ë ·¿Àë¸ÀÃæ¤Ë¼¨¤·¤Æ¤ä¤ëɬÍפ¬¤¢¤ë¡¥ ¿Áê·¿¥ê¥¹¥È¤Î·¿¤ò¥ô¥¡¥ê¥¢¥ó¥È·¿¤ÇÄêµÁ¤¹¤ë¤È¤¹¤ì¤Ð¡¤
# type 'a list = Nil | Cons of 'a * 'a list;; type 'a list = Nil | Cons of 'a * 'a list
¤È¤¤¤Ã¤¿ÄêµÁ¤Ë¤Ê¤ë¡¥'a ¤¬·¿¥Ñ¥é¥á¡¼¥¿¤òɽ¤·¤Æ¤¤¤ë¡¥
¤½¤Î¾¡¤ÉÑÈˤ˻Ȥï¤ì¤ë¿ÁêŪ¥Ç¡¼¥¿·¿¤È¤·¤Æ¤Ï¡¤¥ª¥×¥·¥ç¥ó·¿¤È¤¤¤¦°Ê²¼¤ÇÄêµÁ ¤µ¤ì¤ë·¿¤¬¤¢¤ë¡¥
# type 'a option = None | Some of 'a;; type 'a option = None | Some of 'a
ŵ·¿Åª¤Ë¤Ï None ¤¬Î㳰Ū¤Ê¡ÖÅú¤¨¤¬¤Ê¤¤¡×Ãͤòɽ¤·¡¤Àµ¾ï¤Ë·×»»¤¬¹Ô¤ï¤ì¤¿ ¾ì¹ç¤Ë Some v ¤È¤¤¤¦·Á¤Ç v ¤È¤¤¤¦Ãͤ¬Ê֤äƤ¯¤ë¡¥(Java, C ¤Ê¤É¤Ç¡¤null ¤â¤·¤¯¤Ï NULL ¤òÍѤ¤¤ÆÎ㳰Ū¤ÊÃͤò¼¨¤·¤Æ¤¤¤ë¤Î ¤È»÷¤Æ¤¤¤ë¡¥)¥ª¥×¥·¥ç¥ó·¿¤Ïocamlµ¯Æ°»þ¤ËÄêµÁºÑ¤Î·¿¤Ç¤¢¤ë¡¥
¥ô¥¡¥ê¥¢¥ó¥È·¿¤Ï¡¤°ìÈÌŪ¤Ë¤Ï°Ê²¼¤Î¤è¤¦¤Êʸˡ¤ÇÀë¸À¤µ¤ì¤ë¡¥[]¤Ç °Ï¤Þ¤ì¤¿Éôʬ¤Ï¾Êά²Äǽ¤Ç¤¢¤ë¡¥
type [⟨ ·¿ÊÑ¿ô11 ⟩ ⋯ ⟨ ·¿ÊÑ¿ô1k ⟩] ⟨ ·¿Ì¾1 ⟩ =
⟨ ¥³¥ó¥¹¥È¥é¥¯¥¿11 ⟩ [of ⟨ ·¿11 ⟩] | ⋯ | ⟨ ¥³¥ó¥¹¥È¥é¥¯¥¿1n ⟩ [of ⟨ ·¿1l ⟩]
and [⟨ ·¿ÊÑ¿ô21 ⟩ ⋯ ⟨ ·¿ÊÑ¿ô1m ⟩] ⟨ ·¿Ì¾2 ⟩ =
⟨ ¥³¥ó¥¹¥È¥é¥¯¥¿21 ⟩ [of ⟨ ·¿21 ⟩] | ⋯ | ⟨ ¥³¥ó¥¹¥È¥é¥¯¥¿2m ⟩ [of ⟨ ·¿2n ⟩]
and [⟨ ·¿ÊÑ¿ô3 ⟩ ⋯ ⟨ ·¿ÊÑ¿ô3p ⟩] ⟨ ·¿Ì¾3 ⟩ = ⋯
⋮
ÌÚ(tree)¹½Â¤¤Ï¥ê¥¹¥È¡¤ÇÛÎó¤Ê¤É¤ÈʤÖÂåɽŪ¤Ê¥Ç¡¼¥¿¹½Â¤¤Ç ÍÍ¡¹¤Ê¤È¤³¤í¤Ë±þÍѤ¬¸«¤é¤ì¤ë¡¥Ìڤϡ¤¥é¥Ù¥ë¤È¸Æ¤Ð¤ì¤ë¥Ç¡¼¥¿¤ò³ÊǼ¤¹¤ë¤¿¤á¤Î ¥Î¡¼¥É(node)¤Î½¸¤Þ¤ê¤«¤é¹½À®¤µ¤ì¡¤³Æ¥Î¡¼¥É¤Ï¡¤ 0 ¸Ä°Ê¾å¤Î»Ò¥Î¡¼¥É(child node)¤ò»ý¤Ä¤è¤¦¤Ê³¬Áع½Â¤¤ò¤Ê¤·¤Æ¤¤¤ë¡¥ ³¬Áع½Â¤¤Î°ìÈÖ¡Ö¾å¡×¤Î¥Î¡¼¥É¤òº¬(root)¤È¸Æ¤Ö¡¥ ÌÚ¤ÏÍÍ¡¹¤Ê¤È¤³¤í¤Ë±þÍѤµ¤ì¤Æ¤¤¤Æ¡¤UNIX ¤Î¥Õ¥¡¥¤¥ë¥·¥¹¥Æ¥à¤ÏÌÚ¹½Â¤¤Î°ìÎã¤Ç¤¢¤ë¡¥ ÌÚ¹½Â¤¤Î¤¦¤Á³Æ¥Î¡¼¥É¤Î»Ò¶¡¤Î(ºÇÂç)¿ô n ¤¬·è¤Þ¤Ã¤Æ¤¤¤ë¤â¤Î¤ò nʬÌÚ¤È ¸Æ¤Ö¡¥n=1¤Î¤â¤Î¤Ï¥ê¥¹¥È¤ÈƱÍͤʹ½Â¤¤Ë¤Ê¤ë¡¥¤³¤³¤Ç¤ÏºÇ¤âñ½ã¤ÊÆóʬÌÚ¤ò °·¤Ã¤Æ¤¤¤¯¡¥
ÆóʬÌÚ¹½Â¤¤ÏºÆµ¢Åª¤Ë¼¡¤Î¤è¤¦¤ËÄêµÁ¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡¥
¤³¤ì¤ò Objective Caml ¤Î·¿ÄêµÁ¤Ëľ¤·¤¿¤â¤Î¤¬°Ê²¼¤ÎÄêµÁ¤Ç¤¢¤ë¡¥
# type 'a tree = Lf | Br of 'a * 'a tree * 'a tree;; type 'a tree = Lf | Br of 'a * 'a tree * 'a tree
Lf ¤ÏÍÕ¡¤Br (»Þ/branch)¤Ï¥Î¡¼¥É¤Î¤³¤È¤Ç¡¤º¸±¦¤ÎÉôʬÌÚ¤È ¤½¤Î¥é¥Ù¥ë¤«¤é tree ¤ò¹½À®¤¹¤ë¡¥ ¤Þ¤¿¡¤¥ê¥¹¥È¤ÈƱÍÍ¡¤¥Ç¡¼¥¿¹½Â¤¤òµ½Ò¤¹¤ë¥Ç¡¼¥¿·¿¤Ç¤¢¤ë¤Î¤Ç¥é¥Ù¥ë¤Î·¿¤ÏÆÃÄê ¤·¤Æ¤¤¤Ê¤¤(¿ÁêŪ¤Ç¤¢¤ë)¡¥
¼ÂºÝ¤ÎÌÚ¤ÎÎã¤ò¸«¤Æ¤ß¤è¤¦¡¥Î㤨¤Ð¡¤
| a −[dl] −[dr]b −[dl]c −[dl] −[dr]def |
¤Î¤è¤¦¤Êʸ»ú¤«¤é¤Ê¤ëÌڤϡ¤
# let chartree = Br ('a', Br ('b', Br ('d', Lf, Lf), Lf),
Br ('c', Br ('e', Lf, Lf), Br ('f', Lf, Lf)));;
val chartree : char tree =
Br ('a', Br ('b', Br ('d', Lf, Lf), Lf),
Br ('c', Br ('e', Lf, Lf), Br ('f', Lf, Lf)))
¤Èɽ¸½¤Ç¤¤ë¡¥»Ò¥Î¡¼¥É¤Î¤Ê¤¤¥Î¡¼¥É¤Ï Br (.., Lf, Lf) ¤Çɽ¤·¤Æ¤¤¤ë¡¥
ÌÚ¤ÎÂ礤µ¤ò·×¤ë»ØÉ¸¤È¤·¤Æ¤Ï¡¤(¥é¥Ù¥ë¤Ä¤)¥Î¡¼¥É¤Î¿ô¤ä¡¤º¬¤«¤é°ìÈÖ¡Ö¿¼¤¤¡× ¥Î¡¼¥É¤Þ¤Ç¤Î¿¼¤µ¤òÍѤ¤¤ë¡¥°Ê²¼¤Î´Ø¿ô¤Ï¤½¤ì¤é¤òµá¤á¤ë¤â¤Î¤Ç¤¢¤ë¡¥
# let rec size = function
Lf -> 0
| Br (_, left, right) -> 1 + size left + size right;;
val size : 'a tree -> int = <fun>
# let rec depth = function
Lf -> 0
| Br (_, left, right) -> 1 + max (depth left) (depth right);;
val depth : 'a tree -> int = <fun>
ÌÀ¤é¤«¤Ë¡¤ÆóʬÌÚ t ¤ËÂФ·¤Æ¤Ï¾ï¤Ë¡¤size(t) ≤ 2depth(t) − 1 ¤¬ À®Î©¤¹¤ë¡¥¤Þ¤¿¡¤size(t) = 2depth(t) − 1 ¤Ç¤¢¤ë¤è¤¦¤ÊÆóʬÌÚ¤ò ´°Á´ÆóʬÌÚ(complete binary tree)¤È¸Æ¤Ö¡¥
# let comptree = Br(1, Br(2, Br(4, Lf, Lf),
Br(5, Lf, Lf)),
Br(3, Br(6, Lf, Lf),
Br(7, Lf, Lf)));;
val comptree : int tree =
Br (1, Br (2, Br (4, Lf, Lf), Br (5, Lf, Lf)),
Br (3, Br (6, Lf, Lf), Br (7, Lf, Lf)))
¤Ï¡¤¿¼¤µ3¤Î´°Á´ÆóʬÌÚ¤ÎÎã¤Ç¤¢¤ë¡¥
# size comptree;; - : int = 7 # depth comptree;; - : int = 3
¤µ¤Æ¡¤ÌÚ¹½Â¤¤«¤éÍ×ÁǤòÎóµó¤¹¤ëÊýË¡¤ò¹Í¤¨¤Æ¤ß¤è¤¦¡¥Îóµó¤¹¤ë¤¿¤á ¤Ë¤Ï¡¤¥é¥Ù¥ë¥Ç¡¼¥¿¤ËŬÅö¤Ê½ç½ø¤ò¤Ä¤±¤ëɬÍפ¬¤¢¤ë¡¥¤³¤Î½ç½ø¤ÎÉÕ¤±Êý¤ÎÂåɽŪ¤Ê ¤â¤Î£³¤Ä¡¤¹Ô¤¤¬¤±½ç(preorder), Ä̤꤬¤±½ç(inorder)¡¤ µ¢¤ê¤¬¤±½ç(postorder)¤ò¾Ò²ð¤¹¤ë¡¥ Îóµó¤¹¤ë´Ø¿ô¤Ï¤¤¤º¤ì¤â¥ê¥¹¥È¤òÊÖ¤¹´Ø¿ô¤È¤·¤ÆÄêµÁ¤µ¤ì¤ë¤¬¡¤ÀâÌÀ¤È¤·¤Æ¤Ï ÌڤΥΡ¼¥É¤òˬ¤ì¤ë½çÈ֤ΤĤ±¤«¤¿¤È¤·¤ÆÀâÌÀ¤¹¤ë¡¥
¹Ô¤¤¬¤±½ç¤Ï¡¤Ë¬¤ì¤¿¥é¥Ù¥ë¤ò¤Þ¤º¼è¤ê¾å¤²¤Æ¤«¤é¡¤º¸¤ÎÉôʬÌÚ¡¤±¦¤ÎÉôʬÌÚ ¤Î½ç¤Ç¥Î¡¼¥É¤òÎóµó¤¹¤ë¡¥
# let rec preorder = function
Lf -> []
| Br (x, left, right) -> x :: (preorder left) @ (preorder right);;
val preorder : 'a tree -> 'a list = <fun>
# preorder comptree;;
- : int list = [1; 2; 4; 5; 3; 6; 7]
Ä̤꤬¤±½ç¤Ï¡¤¤Þ¤ºº¸¤ÎÉôʬÌÚ¤«¤é»Ï¤á¤Æ¡¤±¦¤ÎÌڤ˹Ԥ¯Á°¤Ë¡¤¥é¥Ù¥ë¤ò ¼è¤ê¾å¤²¤ë¡¥
# let rec inorder = function
Lf -> []
| Br (x, left, right) -> (inorder left) @ (x :: inorder right);;
val inorder : 'a tree -> 'a list = <fun>
# inorder comptree;;
- : int list = [4; 2; 5; 1; 6; 3; 7]
µ¢¤ê¤¬¤±½ç¤Ï¡¤¤Þ¤º¡¤ÉôʬÌÚ¤òÎóµó¤·¤Æ¤«¤é¡¤ºÇ¸å¤Ë¥Î¡¼¥É¥é¥Ù¥ë¤ò¼è¤ê¾å¤²¤ë¡¥
# let rec postorder = function
Lf -> []
| Br (x, left, right) -> (postorder left) @ (postorder right) @ [x];;
val postorder : 'a tree -> 'a list = <fun>
# postorder comptree;;
- : int list = [4; 5; 2; 6; 7; 3; 1]
¤³¤ì¤é¤ÎÄêµÁ¤Ï¡¤@ ¤ò»È¤Ã¤Æ¤¤¤ë¤»¤¤¤Ç¡¤¥µ¥¤¥º¤ËÈæ¤Ù¤Æ¿¼¤µ¤¬Â礤¤¤è¤¦¤Ê (¥¢¥ó¥Ð¥é¥ó¥¹¤Ê)ÌÚ¤ËÂФ·¤Æ¸úΨ¤¬Îɤ¯¤Ê¤¤¡¥¤³¤ì¤ò²þÁ±¤·¤¿¤Î¤¬¼¡¤ÎÄêµÁ¤Ç¤¢¤ë¡¥ ÎóµóºÑÍ×ÁǤò°ú¿ô¤È¤·¤ÆÄɲä·¡¤³Æ¥Î¡¼¥É¤Ç¤Ï¤½¤Î¥ê¥¹¥È¤ËÍ×ÁǤòÄɲÃ(cons)¤¹¤ë ¤³¤È¤À¤±¤Ç¡¤·×»»¤ò¹Ô¤Ã¤Æ¤¤¤ë¡¥(¤³¤ÎÎत¤ÎÄêµÁ¤Ï¡¤¸úΨ¤òÎɤ¯¤¹¤ë¤¿¤á¤Ë¤ï¤ê¤È ¤è¤¯¤È¤é¤ì¤ë¼ê¤Ç¤¢¤ë¤Î¤Ç¡¤¾å¤ÎÁÇľ¤ÊÄêµÁ¤òÍý²ò¤·¤¿¤¦¤¨¤Ç¡¤¥Þ¥¹¥¿¡¼¤¹¤ë²ÁÃÍ ¤Ï¤¢¤ë¡¥)
# let rec preord t l =
match t with
Lf -> l
| Br(x, left, right) -> x :: (preord left (preord right l));;
val preord : 'a tree -> 'a list -> 'a list = <fun>
# preord comptree [];;
- : int list = [1; 2; 4; 5; 3; 6; 7]
Æóʬõº÷ÌÚ(binary search tree)¤Ï¡¤½ç½ø¤Î¤Ä¤±¤é¤ì¤ë ¥Ç¡¼¥¿¤ò³ÊǼ¤¹¤ë¤È¤¤Ë¡¤¤¢¤È¤Ç¸¡º÷¤¬¤·¤ä¤¹¤¤¤è¤¦¤Ë¡¤°ìÄê¤Îµ¬Â§¤Ë ¤·¤¿¤¬¤Ã¤Æ¥Ç¡¼¥¿¤òÇÛÃÖ¤·¤¿ÌڤǤ¢¤ë¡¥¶ñÂÎŪ¤Ë¤Ï¡¤¤¢¤ë¥Î¡¼¥É¤Îº¸¤Î ÉôʬÌڤˤϤ½¤Î¥Î¡¼¥É¾å¤Î¥Ç¡¼¥¿¤è¤ê¾®¤µ¤¤¥Ç¡¼¥¿¤À¤±¤¬¡¤ ±¦¤ÎÉôʬÌڤˤÏÂ礤¤¥Ç¡¼¥¿¤À¤±¤¬Ê¤ó¤Ç¤¤¤ë¤è¤¦¤ÊÌڤǤ¢¤ë¡¥ Î㤨¤Ð
Br (4, Br (2, Lf, Br (3, Lf, Lf)), Br (5, Lf, Lf))
¤Îɽ¤¹ÌÚ¤ÏÆóʬõº÷ÌڤǤ¢¤ë¤¬¡¤
Br (3, Br (2, Br (4, Lf, Lf), Lf), Br (5, Lf, Lf))
¤Ï¤½¤¦¤Ç¤Ï¤Ê¤¤¡¥
Æóʬõº÷ÌÚ¾å¤Ç¡¤¤¢¤ëÍ×ÁǤ¬ÌÚ¤ÎÃæ¤Ë¤¢¤ë¤«¤òÌ䤤¹ç¤ï¤»¤ë mem¡¤ Í×ÁǤòÌÚ¤ËÄɲ乤ë add ´Ø¿ô¤Ï¤½¤ì¤¾¤ì°Ê²¼¤Î¤è¤¦¤Ë¤Ê¤ë¡¥
# let rec mem t x =
match t with
Lf -> false
| Br (y, left, right) ->
if x = y then true
else if x < y then mem left x else mem right x
let rec add t x =
match t with
Lf -> Br (x, Lf, Lf)
| (Br (y, left, right) as whole) ->
if x = y then whole
else if x < y then Br(y, add left x, right) else Br(y, left, add right x);;
val mem : 'a tree -> 'a -> bool = <fun>
val add : 'a tree -> 'a -> 'a tree = <fun>
ÄêµÁ¤«¤é¤ï¤«¤ë¤è¤¦¤Ë¤É¤Á¤é¤â·×»»¤Î¹½Â¤¤ÏƱ¤¸¤Ç¡¤
Ʊ¤¸¥Ç¡¼¥¿¤Î½¸¹ç¤Ç¤â¡¤ÍÍ¡¹¤Ê·Á¤ÎÌÚ¤¬¹Í¤¨¤é¤ì¤ë¡¥ õº÷¤Î¸úΨ¤Ï¡¤Ìڤο¼¤µ¤Ë¤è¤ë¤Î¤Ç¡¤¿¼¤µ¤¬¤Ê¤ë¤Ù¤¯Àõ¤¤ÌÚ¤ò°Ý»ý ¤¹¤ë¤Î¤¬Æóʬõº÷ÌÚ¤ò°·¤¦ºÝ¤ÎÌÜɸ¤Î¤Ò¤È¤Ä¤È¤Ê¤ë¡¥
¤â¤¦¤Ò¤È¤Ä¡¤±þÍÑÎã¤È¤·¤Æ¡¤Ìµ¸Â¤Î¥Ç¡¼¥¿Îó¤òɽ¤¹ ¥Ç¡¼¥¿·¿¤ò¤ß¤Æ¤ß¤è¤¦¡¥Ìµ¸ÂÎó¤ò͸¤Υá¥â¥ê¾å¤Ë¤½¤Î¤Þ¤Þɽ¸½¤¹¤ë¤³¤È¤Ï¤Ç¤¤Ê ¤¤¤Î¤Ç¡¤¹©Éפ¬É¬ÍפǤ¢¤ë¡¥¤³¤³¤Ç¤Ï̵¸ÂÎó¤Ï¡¤ÀèÆ¬Í×ÁǤȡ¤¡Ö°Ê¹ß¤Î(̵¸Â)Îó¤ò ·×»»¤¹¤ë¤¿¤á¤Î´Ø¿ô¡×¤ÎÁȤÇɽ¸½¤¹¤ë¡¥¤³¤Î¡Ö´Ø¿ô¡×¤ÏÆÃ¤Ë°ú¿ô¤È¤Ê¤ë¤Ù¤ ¾ðÊó¤òɬÍפȤ·¤Ê¤¤¤Î¤Ç¡¤unit ¤«¤é¤Î´Ø¿ô¤È¤·¤ÆÉ½¸½¤·¤è¤¦¡¥ ¤³¤ì¤ò½ñ¤¤¤¿¤Î¤¬°Ê²¼¤Î type Àë¸À¤Ç¤¢¤ë¡¥
# type 'a seq = Cons of 'a * (unit -> 'a seq);; type 'a seq = Cons of 'a * (unit -> 'a seq)
seq ¤Ï list ¤ä tree ¤Î¤è¤¦¤ËÍ×ÁÇ·¿¤Ë´Ø¤·¤ÆÂ¿ÁêŪ¤Ç¤¢¤ë¡¥ Cons ¤ÏÍ×ÁǤòÀèÆ¬¤ËÄɲ乤뤿¤á¤Î¥³¥ó¥¹¥È¥é¥¯¥¿¤Ç¤¢¤ê¡¤ of °Ê²¼¤Î·¿¤¬¼¨¤¹¤è¤¦¤Ë¡¤tail Éôʬ¤Ï´Ø¿ô·¿¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡¥¤³¤Î¥ô¥¡¥ê¥¢¥ó¥È·¿ ¤Ï¥³¥ó¥¹¥È¥é¥¯¥¿¤¬°ì¤Ä¤·¤«¤Ê¤¤¤¿¤á¡¤¥ô¥¡¥ê¥¢¥ó¥È·¿¤ò¤ï¤¶¤ï¤¶»È¤ï¤º¤Ë¡¤Í×ÁǤȴؿô¤ÎÁȤÇɽ¸½¤¹¤ë¤³¤È¤â¸¶ÍýŪ¤Ë²Äǽ¤Ç¤¢¤ë¡¥¤³¤Î¤è¤¦¤Ê·¿¤òÀë¸À¤¹¤ë¤Î ¤Ï¡¤¥Ç¡¼¥¿Ãê¾Ý¤Î¼êÃʤΤҤȤĤǤ¢¤ë¤È¹Í¤¨¤é¤ì¤ë¡¥¤Ä¤Þ¤ê¡¤¥×¥í¥°¥é¥Þ¤¬ ¥Ç¡¼¥¿¤Ë¤³¤á¤¿°ÕÌ£¤ò¥×¥í¥°¥é¥à¾å¤ÇÆÉ¤ß¼è¤ë¤³¤È¤¬¤Ç¤¡¤¤¿¤Þ¤¿¤ÞƱ¤¸É½¸½ ¤ò¤â¤Ä°ã¤¦°ÕÌ£¤Î¥Ç¡¼¥¿¤Èº®Í𤹤ë²ÄǽÀ¤¬¾¯¤Ê¤¯¤Ê¤ë¡¤¤È¤¤¤¦°ÕµÁ¤¬¤¢¤ë¡¥
¼¡¤Î´Ø¿ô from ¤Ï¡¤À°¿ô n ¤«¤é1¤º¤ÄÁý¤¨¤ë̵¸ÂÎó¤òÀ¸À®¤¹¤ë¡¥
# let rec from n = Cons (n, fun () -> from (n + 1));; val from : int -> int seq = <fun>
fun () -> ¤ËÃíÌܤ·¤¿¤¤¡¥Ìµ¸ÂÎó¤Ï¡¤fun () -> ... »È¤Ã¤Æ ´Ø¿ô¤ò¹½À®¤·¡¤tail Éô¤Îɾ²Á¤ò¡¤É¬ÍפʤȤ¤Þ¤ÇÃ٤餻¤Æ¤¤¤ë¤«¤é ¼Â¸½¤Ç¤¤Æ¤¤¤ë¤Î¤Ç¤¢¤ë¡¥Æ±Íͤʴؿô¤ò¥ê¥¹¥È¤ò»È¤Ã¤ÆÄê µÁ¤·¤Æ¤â¡¤
let rec list_from n = n :: list_from (n + 1)
¤Ò¤È¤¿¤Ó¸Æ¤Ó½Ð¤µ¤ì¤ë¤È¡¤list_from ¤Î¸Æ¤Ó½Ð¤·¤ò̵¸Â¤Ë¹Ô¤Ã¤Æ¤·¤Þ¤¦¤Î¤Ç ¤¦¤Þ¤¯¤¤¤«¤Ê¤¤¡¥
from ¤ÎÄêµÁ¤Ë¤ß¤é¤ì¤ë¤è¤¦¤Ë¡¤¼°¤Îɾ²Á¤òÃ٤餻¤ë¤¿¤á¤Ë ƳÆþ¤µ¤ì¤ë´Ø¿ô¤ò¥µ¥ó¥¯(thunk)¤È¸Æ¤Ö¡¥ ;Ã̤Ǥ¢¤ë¤¬¡¤¥µ¥ó¥¯¤ÎÌÀ¼¨Åª¤ÊƳÆþ¤ÏÃÙ±äɾ²Áµ¡¹½¤ò»ý¤Ä¸À¸ì¤Ç¤¢¤ì¤ÐɬÍפΤʤ¤¤È¤³¤í¤Ç¤¢¤ë(¤â¤È¤â¤ÈÉôʬ¼°¤Îɾ²Á¤Ï ɬÍפˤʤë¤Þ¤ÇÃ٤餵¤ì¤ë)¤¿¤á¡¤¤³¤Î¤è¤¦¤Ê̵¸Â¤Î¹½Â¤¤Ï lazy ¤Ê¸À¸ì¤ÎÆÀ °Õ¤È¤¹¤ë¤È¤³¤í¤Ç¤¢¤ë¡¥
Î󤫤éÀèÆ¬Í×ÁÇ¡¤¸å³¤ÎÎó¤òÊÖ¤¹´Ø¿ô¡¤ÀèÆ¬¤«¤é n Í×ÁǤò¥ê¥¹¥È¤È¤·¤Æ¼è½Ð¤¹ ´Ø¿ô¤Ï¡¤
# let head (Cons (x, _)) = x;;
val head : 'a seq -> 'a = <fun>
# let tail (Cons (_, f)) = f ();;
val tail : 'a seq -> 'a seq = <fun>
# let rec take n s =
if n = 0 then [] else head s :: take (n - 1) (tail s);;
val take : int -> 'a seq -> 'a list = <fun>
# take 10 (from 4);;
- : int list = [4; 5; 6; 7; 8; 9; 10; 11; 12; 13]
¤ÈÄêµÁ¤µ¤ì¤ë¡¥tail ´Ø¿ô¤ÎËÜÂΤǤϥµ¥ó¥¯¤Ë () ¤òŬÍѤ·¤Æ¡¤¸å³Îó¤ò ·×»»¤·¤Æ¤¤¤ë¡¥ ¥³¥ó¥¹¥È¥é¥¯¥¿¤¬¤Ò¤È¤Ä¤Î¥ô¥¡¥ê¥¢¥ó¥È·¿¤ËÂФ·¤Æ¤Ï¡¤¾ì¹ç ¤ï¤±¤ò¤¹¤ëɬÍפ¬¤Ê¤¤ ¤Î¤Ç¡¤match ¤ò»È¤ï¤º¤Ë°ú¿ô¤Ë¥Ñ¥¿¡¼¥ó¤òľÀܽñ¤¤ ¤Æ¤â»Ù¾ã¤¬¤Ê¤¤¡¥ take ¤Ï¥ê¥¹¥È¤ËÂФ·¤Æ¤Î¤â¤Î¤ÈƱÍͤËÄêµÁ¤Ç¤¤ë¡¥
¤µ¤Æ¡¤Ìµ¸ÂÎó¤ËÂФ¹¤ë map ¤òÄêµÁ¤·¤Æ¤ß¤è¤¦¡¥
# let rec mapseq f (Cons (x, tail)) =
Cons (f x, fun () -> mapseq f (tail ()));;
val mapseq : ('a -> 'b) -> 'a seq -> 'b seq = <fun>
# let reciprocals = mapseq (fun x -> 1.0 /. float_of_int x) (from 2);;
val reciprocals : float seq = Cons (0.5, <fun>)
# take 5 reciprocals;;
- : float list = [0.5; 0.333333333333333315; 0.25; 0.2; 0.166666666666666657]
ÃíÌܤ¹¤Ù¤ÅÀ¤Ï¡¤reciprocals ¤ÎÃͤò¸«¤ë¤È¤ï¤«¤ë¤è¤¦¤Ë¡¤ 0.5 °Ê¹ß¤ÎÍ×ÁÇ¤Ï take ¤ò¤¹¤ë¤Þ¤Ç¼ÂºÝ¤Ë¤Ï·×»»¤µ¤ì¤Æ¤¤¤Ê¤¤¤³¤È¤Ç¤¢¤ë¡¥ take ¤ÎÃæ¤Ç¡¤tail ¤ò¸Æ¤Ó½Ð¤¹Å٤˵տô¤¬·×»»¤µ¤ì¤Æ¤¤¤¯¡¥
;Ã̤Ǥ¢¤ë¤¬¡¤Ê£»¨¤Ê¥Ç¡¼¥¿·¿¤Ë¤¿¤¤¤¹¤ë´Ø¿ô¤ò½ñ¤¤¤Æ¤¤¤ì¤Ð¤¤¤ë¤Û¤É·¿¾ðÊó ¤¬¥Ç¥Ð¥°¤ËÌòΩ¤Ä¤³¤È¤¬¼Â´¶¤Ç¤¤ë¡¥¾å¤Î´Ø¿ôÄêµÁ¤Ç¡¤¤Ä¤¤¡¤¥µ¥ó¥¯Æ³Æþ¤Î¤¿ ¤á¤Î fun () -> ¤ò½ñ¤Ëº¤ì¤Æ¤·¤Þ¤Ã¤¿¤ê¡¤¥µ¥ó¥¯¤Îɾ²Á(tail ())¤ò¤·Ëº ¤ì¤¿¤ê¤¹¤ë¤Î¤À¤¬¡¤·¿¤Î¤ª¤«¤²¤Ç(¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤Ë¤Ê¤ì¤ì¤Ð)¤¹¤°¤Ë´Ö°ã¤¤ ¤òȯ¸«¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡¥
¤µ¤Æ¡¤¤â¤¦¤¹¤³¤·ÌÌÇò¤¤Ìµ¸ÂÎó¤Î±þÍÑÎã¤ò¤ß¤Æ¤ß¤¿¤¤¡¥ ¥¨¥é¥È¥¹¥Æ¥Í¥¹¤Î¤Õ¤ë¤¤¤ÏÁÇ¿ô¤òµá¤á¤ë¤¿¤á¤Î·×»»ÊýË¡¤Ç¡¤ 2°Ê¾å¤ÎÀ°¿ô¤ÎÎ󤫤顤
¤È¤·¤ÆÁÇ¿ô¤ÎÎó¤òµá¤á¤ëÊýË¡¤Ç¤¢¤ë¡¥ ¤³¤³¤Ç¤Ï¡¤seq ·¿¤òÍѤ¤¤Æ¥¨¥é¥È¥¹¥Æ¥Í¥¹¤Î¤Õ¤ë¤¤¤ò¼Â¸½¤·¤Æ¤ß¤è¤¦¡¥ ¤Þ¤ºÉ¬ÍפʤΤϡ¤À°¿ôÎ󤫤é n ¤ÎÇÜ¿ô¤ò¼è¤êµî¤Ã¤¿Îó¤ò ÊÖ¤¹´Ø¿ô sift ¤Ç¤¢¤ë¡¥
let rec sift n ... = ...;;
¤³¤ì¤ò»È¤¦¤È¥¨¥é¥È¥¹¥Æ¥Í¥¹¤Î¤Õ¤ë¤¤¤Ï¡¤¼¡¤Î¤è¤¦¤ËÄêµÁ¤Ç¤¤ë¡¥
# let rec sieve (Cons (x, f)) = Cons (x, fun () -> sieve (sift x (f())));; val sieve : int seq -> int seq = <fun>
# let primes = sieve (from 2);;
val primes : int seq = Cons (2, <fun>)
# take 20 primes;;
- : int list =
[2; 3; 5; 7; 11; 13; 17; 19; 23; 29; 31; 37; 41; 43; 47; 53; 59; 61; 67; 71]
# let rec nthseq n (Cons (x, f)) =
if n = 1 then x else nthseq (n - 1) (f());;
val nthseq : int -> 'a seq -> 'a = <fun>
# nthseq 1000 primes;;
- : int = 7919
type loc_fig = {x : int; y : int; fig : figure};;
# reflect comptree;; - : int tree = Br (1, Br (3, Br (7, Lf, Lf), Br (6, Lf, Lf)), Br (2, Br (5, Lf, Lf), Br (4, Lf, Lf)))¤Þ¤¿¡¤Ç¤°Õ¤ÎÆóʬÌÚ t ¤ËÂФ·¤ÆÀ®Î©¤¹¤ë¡¤°Ê²¼¤ÎÊýÄø¼°¤ò´°À®¤µ¤»¤è¡¥
|
# type arith =
Const of int | Add of arith * arith | Mul of arith * arith;;
type arith = Const of int | Add of arith * arith | Mul of arith * arith
# (* exp stands for (3+4) * (2+5) *)
let exp = Mul (Add (Const 3, Const 4), Add (Const 2, Const 5));;
val exp : arith = Mul (Add (Const 3, Const 4), Add (Const 2, Const 5))
¿ô¼°¤Îʸ»úÎóɽ¸½¤òµá¤á¤ë´Ø¿ô string_of_arith, ʬÇÛ§¤òÍѤ¤¤Æ
¿ô¼°¤ò (i11 × ⋯ × i1n1) + ⋯ +
(im1 × ⋯ × imnm) ¤Î·Á¤ËÊÑ·Á¤¹¤ë´Ø¿ô
expand ¤òÄêµÁ¤»¤è¡¥
# string_of_arith exp;; - : string = "((3+4)*(2+5))" # string_of_arith (expand exp);; - : string = "(((3*2)+(3*5))+((4*2)+(4*5)))"(¥ª¥×¥·¥ç¥ó¤È¤·¤Æ) string_of_arith ¤Î½ÐÎÏ·ë²Ì¤Î³ç¸Ì¤ò¸º¤é¤¹¤è¤¦¤Ë¹©Éפ»¤è¡¥ (¾å¤Î½ÐÎÏÎã¤Ç¤Ï²¿¤â¹©Éפ·¤Æ¤¤¤Ê¤¤¡¥)
# type ('a, 'b) sum = Left of 'a | Right of 'b;;
type ('a, 'b) sum = Left of 'a | Right of 'b
# let float_of_int_or_float = function
Left i -> float_of_int i
| Right f -> f;;
val float_of_int_or_float : (int, float) sum -> float = <fun>
# float_of_int_or_float (Right 3.14);;
- : float = 3.14
# float_of_int_or_float (Left 2);;
- : float = 2.
¤³¤ì¤òƧ¤Þ¤¨¤Æ¡¤¼¡¤Î·¿¤ò¤â¤Ä´Ø¿ô¤òÄêµÁ¤»¤è¡¥
ËܾϤÏObjective Caml¤ËÈ÷¤ï¤Ã¤Æ¤¤¤ëÉûºîÍѤòȼ¤¦µ¡Ç½¤ò³µ´Ñ¤¹¤ë¡£ Objective Caml¥×¥í¥°¥é¥à¤Î¼Â¹Ô¤Ï¼°¤òÃͤËɾ²Á¤¹¤ë²áÄø¤Ç¤¢¤Ã¤¿¡¥ ÉûºîÍѤȤϡ¢¼°¤Îɾ²ÁÃæ¤Ëµ¯¤³¤ë¡Ö¤Ê¤Ë¤«¡×¤Ç¤¢¤ê¡¢ ÂåÆþ¡¢¥Õ¥¡¥¤¥ë¤Ø¤ÎÆþ½ÐÎϤʤɤ¬¤½¤Î°ìÎã¤Ç¤¢¤ë¡£ ÉûºîÍѤòȼ¤ï¤Ê¤¤¼°¤Ï²¿ÅÙɾ²Á¤·¤Æ¤â·ë²Ì¤ÏÉÔÊѤǤ¢¤ê¡¤¤Þ¤¿¡¤¼°¤ò¤½¤Îɾ²Á·ë²Ì¤ÎÃÍ ¤ÇÃÖ´¹¤¨¤Æ¤â¥×¥í¥°¥é¥à¤Îµóư¤ÏÊѲ½¤·¤Ê¤¤¡¥ °ìÊý¡¤ÉûºîÍѤòȼ¤¦¼°¤Ï¡¤É¾²Á¤¹¤ëÅ٤˰ã¤Ã¤¿·ë²Ì¤¬ÆÀ¤é¤ì¤ë²ÄǽÀ¤¬¤¢¤ê¡¤ ɾ²Á·ë²Ì¤Ç¤½¤Î¼°¤òÃÖ´¹¤¨¤Æ¤·¤Þ¤¦¤È¥×¥í¥°¥é¥à¤Î µóư¤¬ÊѤï¤Ã¤Æ¤·¤Þ¤¦¡£¤½¤Î¤¿¤á¡¤ÉûºîÍѤòȼ¤¦¥×¥í¥°¥é¥à¤Îµóư¤Ï¤·¤Ð¤·¤Ð¿äÏÀ ¤·¤Ë¤¯¤¯¤Ê¤ë¡£
ÉûºîÍѤòȼ¤¦´Ø¿ô¤Î°ìÎã¤Ï¡¤Ã¼Ëö¤Ø¤Îɽ¼¨¤ò¹Ô¤¦´Ø¿ô print_string ¤Ç¤¢¤ë¡¥
# print_string "Hello, World!\n";; Hello, World! - : unit = ()
¤³¤³¤Ç¤Ï¡¤ÉûºîÍѤȤ·¤Æ°ú¿ô¤Îʸ»úÎó¤¬É¸½à½ÐÎÏ(üËö²èÌÌ)¤Ø½ñ¤½Ð¤µ¤ì¤Æ¤¤¤ë¡¥ ¤Þ¤¿¡¤¤³¤Î´Ø¿ô¤ÏÊÖ¤êÃͤȤ·¤Æ () ¤òÊÖ¤·¤Æ¤¤¤ë¡¥¤³¤Î¤è¤¦¤Ë¡¤ ÉûºîÍѼ«ÂΤ˰ÕÌ£¤¬¤¢¤ê·×»»·ë²Ì¤È¤·¤Æ¤Ï½ÅÍפÊÃͤòȼ¤ï¤Ê¤¤´Ø¿ô¤Ï¡¤Åµ·¿Åª¤Ë¤Ï unit·¿¤òÊÖ¤¹´Ø¿ô¤È¤·¤ÆÉ½¸½¤µ¤ì¤ë¡¥ (Objective Caml ¤Ç¤Ï´ðËÜŪ¤ËÁ´¤Æ¤Î¥×¥í¥°¥é¥àÃæ¤Î¼°¤Ï²¿¤é¤«¤ÎÃͤòÊÖ¤¹¡¥ Ì¿Îá·¿¸À¸ì¤Ë¤ª¤±¤ë¥³¥Þ¥ó¥É¤â¤³¤Î¤è¤¦¤Ê´Ø¿ô¤È¤·¤ÆÉ½¸½¤µ¤ì¤Æ¤¤¤ë¡¥)
¤Þ¤¿¡¤´Ø¿ô read_line ¤Ï¡¤°ú¿ô () ¤Ç¸Æ¤Ð¤ì¤ë¤È¡¤ üËö¤«¤é¤ÎÆþÎϤòÂÔ¤Á¡¤¤½¤Î·ë²Ì¤òʸ»úÎó¤È¤·¤ÆÊÖ¤¹¡¥
# read_line ();; foo ⇐ ¥¡¼¥Ü¡¼¥É¤«¤é¤ÎÆþÎÏ - : string = "foo"
¥¡¼¥Ü¡¼¥É¤«¤é¤ÎÆþÎϤ¬¤«¤ï¤ëÅÙ¤ËÆ±¤¸¼° read_line () ¤ÎÊÖ¤¹ÃÍ¤Ï ÊѤäƤ¤¤¯¡¥¤½¤Î¤¿¤á¡¤ÉûºîÍѤòȼ¤¦¼°¤Ë¤Ä¤¤¤Æ¤Ï¡¤¤¤¤Äɾ²Á¤µ¤ì¤ë¤«¤ò ¾ï¤ËƬ¤Ë¤¤¤ì¤Æ¥×¥í¥°¥é¥à¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¤³¤³¤Þ¤Ç¸«¤¿¥×¥í¥°¥é¥à¤Ç¤Ï°ìÅÙºîÀ®¤·¤¿¥Ç¡¼¥¿¤ò¹¹¿·¤¹¤ë¼êÃʤÏÍ¿¤¨¤é¤ì¤Æ¤¤¤Ê ¤¤¡¥Objective Caml ¤Ë¤Ï¤¤¤¯¤Ä¤«¤Î¹¹¿·²Äǽ¤Ê¥Ç¡¼¥¿¹½Â¤¤¬ÍѰդµ¤ì¤Æ¤¤¤ë¡¥»²¾È(references)¡¤¹¹¿·²Äǽ¥ì¥³¡¼¥É(mutable records)¡¤ÇÛÎó(array)¤Ç¤¢¤ë¡¥
Objective Caml ¤Ë¤ª¤±¤ë»²¾È¤Î³µÇ°¤Ï¤Û¤Ü¥á¥â¥ê¥¢¥É¥ì¥¹¤È¹Í¤¨¤ë¤³¤È¤¬¤Ç¤¡¤ C ¤Ë¤ª¤±¤ëÊÑ¿ô¡¤¥Ý¥¤¥ó¥¿¤Ê¤É¤ËÂбþ¤¹¤ë¡¥»²¾È¤ÎÃͤϤ½¤Î ¥¢¥É¥ì¥¹¤¬»Ø¤¹Àè¤Ë¥Ç¡¼¥¿¤ò³ÊǼ¤·¤Æ¤ª¤ê¡¤ÂåÆþÁàºî¤Ë¤è¤Ã¤Æ ¤½¤ÎÆâÍÆ¤ò½ñ¤´¹¤¨¤ë¤³¤È¤¬¤Ç¤¤ë¡¥t ·¿¤ÎÃͤؤλ²¾ÈÃÍ¤Ï t ref ·¿¤¬Í¿¤¨¤é¤ì¤ë¡¥
»²¾È¤ÎÀ¸À®¤Ï ref ´Ø¿ô¤Ç¹Ô¤¦¡¥ref ´Ø¿ô¤Ï»²¾ÈÀè¤Ë³ÊǼ¤¹¤ë½é´üÃͤò °ú¿ô¤È¤·¤Æ¤È¤ê¡¤¤½¤ì¤ò³ÊǼ¤·¤¿¥¢¥É¥ì¥¹¤òÊÖ¤¹¡¥(¤¿¤À¤·¡¤¼ÂºÝ¤Î¥¢¥É¥ì¥¹¤Î ¿ôÃͤ¬´Ñ»¡¤Ç¤¤ë¤ï¤±¤Ç¤Ï¤Ê¤¤¡¥) ¤³¤Î´Ø¿ô¤ÏÄ̾ï¤Î¿ô³ØÅª¤Ê°ÕÌ£¤Î´Ø¿ô¤È¤Ï°ã¤¤¡¤read_line ¤Î¤è¤¦¤Ë ¸Æ¤Ó½Ð¤¹Å٤˿·¤·¤¤ÃÍ(¥¢¥É¥ì¥¹)¤òÊÖ¤¹¡¥»²¾È¤«¤é³ÊǼ¤µ¤ì¤¿Ãͤò¼è½Ð¤¹¤Ë¤Ï Á°ÃÖ¥ª¥Ú¥ì¡¼¥¿ ! ¤ò»ÈÍѤ¹¤ë¡¥¤Þ¤¿¡¤ÂåÆþ¼°
⟨ ¼°1 ⟩ := ⟨ ¼°2 ⟩
¤Ï⟨ ¼°1 ⟩¤òɾ²Á¤·¤¿·ë²Ì¤Î»²¾È¤Ë ⟨ ¼°2 ⟩¤Îɾ²Á·ë²Ì¤òÂåÆþ¤¹¤ë¤â¤Î¤Ç¤¢¤ë¡¥ ±¦Êդη¿¤¬ t ¤Ç¤¢¤ë¤È¤¤Ë¤Ï¡¤º¸Êդη¿¤Ï t ref ¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥ ÂåÆþ¼°¼«ÂΤÏÂåÆþ¤È¤¤¤¦ÉûºîÍѤòµ¯¤¹¤À¤±¤Ç¡¤¤½¤Î·ë²Ì¤Ï¾ï¤Ë()¤Ç¤¢¤ë¡¥ °Ê²¼¤Ï´Êñ¤Ê»²¾È¤ò»È¤Ã¤¿Îã¤Ç¤¢¤ë¡¥
# let p = ref 5 and q = ref 2;; val p : int ref = contents = 5 val q : int ref = contents = 2 # (!p, !q);; - : int * int = (5, 2) # p := !p + !q;; - : unit = () # (!p, !q);; - : int * int = (7, 2)
»²¾È¤òÍý²ò¤¹¤ë¾å¤ÇÂç»ö¤Ê¤Î¤Ï¡¤³ÊǼ¤µ¤ì¤Æ¤¤¤ëÃͤȤ½¤ì¤Î¥¢¥É¥ì¥¹¤ò¶èÊ̤¹¤ë¤³ ¤È¤Ç¤¢¤ë¡¥ÂåÆþ¼°¤Ïº¸ÊդΥ¢¥É¥ì¥¹¤ÎÆâÍÆ¤ò±¦ÊÕ¤ÎÃÍ¤Ç ½ñ¤´¹¤¨¤ë¡¥! ¤¬É¬ÍפʤΤ⡤¤³¤Î¶èÊ̤ò¤Ï¤Ã¤¤ê¤µ¤»¤ë¤â¤Î¤È»×¤¨¤ÐÎɤ¤¡¥ C ¤Ê¤É¤ÎÂåÆþʸ¤Ç¤Ï¡¤i = j ¤È½ñ¤¤¤¿¤È¤¤Ë¡¤º¸ÊդϰÅÌۤΤ¦¤Á¤ËÊÑ¿ô i ¤Î ¥¢¥É¥ì¥¹¤ò¤µ¤·¡¤±¦ÊդΠj ¤ÏÊÑ¿ô j ¤ÎÆâÍÆ¤ò»Ø¤·¼¨¤·¤Æ¤¤¤ë¡¥
»²¾ÈÃͤϥǡ¼¥¿¹½Â¤¤Ë³ÊǼ¤¹¤ë¤³¤È¤â¤Ç¤¤ë¡¥
# let reflist = [p; q; p];; val reflist : int ref list = [contents = 7; contents = 2; contents = 7] # p := 100;; - : unit = () # reflist;; - : int ref list = [contents = 100; contents = 2; contents = 100]
ÂåÆþÁàºî¤¬ reflist ¤Î½ÐÎÏ·ë²Ì¤ËÊѲ½¤òÍ¿¤¨¤Æ¤¤¤ë¤³¤È¤ËÃí°Õ¡¥ ¤¿¤À¤·¡¤reflist ¤Î3Í×ÁǤÎÃÍ(¥¢¥É¥ì¥¹)¤¬ÊѲ½¤·¤¿¤Î¤Ç¤Ï¤Ê¤¯¡¤ ¤½¤Î»Ø¤·¼¨¤¹Ãͤ¬ÊѤ俤À¤±¤Ç¤¢¤ë¤³¤È¤Ëα°Õ¤»¤è¡¥¤³¤Î¤è¤¦¤Ë Ʊ¤¸»²¾È¤¬Ê£¿ô¸Ä½ê¤Ç»ÈÍѤµ¤ì¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¤¤¢¤ë¾ì½ê¤Ç¤ÎÂåÆþ¤¬ Ê̤ξì½ê¤Ë±Æ¶Á¤ò¤ª¤è¤Ü¤¹¤³¤È¤ò¥¨¥¤¥ê¥¢¥·¥ó¥°(aliasing)¤È¤¤¤¤¡¤ Ì¿Îá·¿¸À¸ì¤Î¥×¥í¥°¥é¥ß¥ó¥°¤ÇƬ¤òǺ¤Þ¤»¤ë¼ï¤Î°ì¤Ä¤Ç¤¢¤ë¡¥
¤Þ¤¿¡¤»²¾È¤Î»²¾È¤ò¹Í¤¨¤ë¤³¤È¤â¤Ç¤¡¤C¤Ë¤ª¤±¤ë¥Ý¥¤¥ó¥¿¤Î¤è¤¦¤Ë°·¤¦¤³¤È¤¬¤Ç¤¤ë¡¥
# let refp = ref p and refq = ref q;; val refp : int ref ref = contents = contents = 100 val refq : int ref ref = contents = contents = 2 # !refq := !(!refp);; - : unit = () # (!p, !q);; - : int * int = (100, 100)
¤³¤ì¤Þ¤Ç¤ß¤¿¥ì¥³¡¼¥É¤Ç¤Ï¥Õ¥£¡¼¥ë¥É¤ÎÃͤϹ¹¿·¤Ç¤¤Ê¤«¤Ã¤¿¡¥with ¤ò ÍѤ¤¤Æ¤â¡¤¿·¤·¤¤¥Õ¥£¡¼¥ë¥É¤ò»È¤Ã¤¿¿·¤·¤¤¥ì¥³¡¼¥É¤òÀ¸À®¤·¤Æ¤¤¤¿¡¥ ¼Â¤Ï¡¤Objective Caml ¤Î¥ì¥³¡¼¥É¤Ï¥Õ¥£¡¼¥ë¥ÉËè¤Ë¹¹¿·²Äǽ¤«¤É¤¦¤«¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤ ¤ë¡¥¹¹¿·²Äǽ¥Õ¥£¡¼¥ë¥É¤Ë¤Ï·¿Àë¸À»þ¤Ë mutable ¥¡¼¥ï¡¼¥É¤òÍѤ¤¤ë¡¥
# type teacher = {name : string; mutable office : string};;
type teacher = name : string; mutable office : string;
# let t = {name = "Igarashi"; office = "140"};;
val t : teacher = name = "Igarashi"; office = "140"
¥Õ¥£¡¼¥ë¥É¤Î¹¹¿·¤Ï¡¤
⟨ ¼°1 ⟩.⟨ ¥Õ¥£¡¼¥ë¥É̾ ⟩ <- ⟨ ¼°2 ⟩
¤È¤¤¤¦·Á¤Ç¡¤⟨ ¼°1 ⟩¤ÎÃͤǤ¢¤ë¥ì¥³¡¼¥É¤Î⟨ ¥Õ¥£¡¼¥ë¥É̾ ⟩¥Õ¥£¡¼ ¥ë¥É¤ÎÆâÍÆ¤ò ⟨ ¼°2 ⟩ ¤ÇÃÖ´¹¤¨¤ë¡¥
# t.office <- "142";; - : unit = () # t;; - : teacher = name = "Igarashi"; office = "142"
ÇÛÎó¤ÏƱ¤¸¼ïÎà¤ÎÃͤν¸¹ç¤òɽ¤¹¥Ç¡¼¥¿¤È¤¤¤¦°ÕÌ£¤Ç¤Ï¥ê¥¹¥È¤È»÷Ä̤äƤ¤¤ë¤¬¡¤ Ťµ¤ÏÀ¸À®»þ¤Ë¸ÇÄê¤Ç¤¢¤ê¡¤¤É¤ÎÍ×ÁǤˤâľÀÜ(ÀèÆ¬¤«¤é½ç¤Ëé¤ë¤³¤È¤Ê¤¯)¥¢¥¯¥» ¥¹¤Ç¤¤ë¡¥¤Þ¤¿¡¤³ÆÍ×ÁǤò¹¹¿·¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡¥ÇÛÎó¤Ë¤Ï¡¤Í×ÁÇ·¿¤ò t ¤È¤· ¤Æ t array ¤È¤¤¤¦·¿¤¬Í¿¤¨¤é¤ì¤ë¡¥ÇÛÎó¤ÎÀ¸À®¡¤Í×ÁǤλ²¾È¡¤¹¹¿·¤Ï¤½¤ì¤¾¤ì¡¤
[|⟨ ¼°1 ⟩; ⟨ ¼°2 ⟩; …; ⟨ ¼°n ⟩|] ⟨ ¼°1 ⟩.(⟨ ¼°2 ⟩) ⟨ ¼°1 ⟩.(⟨ ¼°2 ⟩) <- ⟨ ¼°3 ⟩
¤È¤¤¤¦·Á¤Ç¹Ô¤¤¡¤n Í×ÁǤÎÇÛÎó¤Ç½é´üÃͤ¬¤½¤ì¤¾¤ì ⟨ ¼°i ⟩¤Ç¤¢¤ë ¤â¤Î¡¤ÇÛÎó⟨ ¼°1 ⟩¤Î ⟨ ¼°2 ⟩ÈÖÌܤÎÍ×ÁÇ¡¤ ÇÛÎó⟨ ¼°1 ⟩¤Î⟨ ¼°2 ⟩ÈÖÌܤÎÍ×ÁǤò⟨ ¼°3 ⟩¤Ç ¹¹¿·¡¤¤È¤¤¤¦°ÕÌ£¤Ç¤¢¤ë¡¥ÇÛÎó¤ÎÂ礤µ¤ò±Û¤¨¤¿À°¿ô¤ÇÍ×ÁǤ˥¢¥¯¥»¥¹¤¹¤ë¤È Invalid_argument ¤È¤¤¤¦Îã³°¤¬È¯À¸¤¹¤ë¡¥
Âè4¾Ï¤Ç¿ÁêÀ¤Ë¤Ä¤¤¤Æ±ä¤Ù¤¿¤È¤¤Ë¡¤Objective Caml ¤Ç¤Ï¿ÁêÀ ¤ÏÃÍ¿Áꡤ¤¹¤Ê¤ï¤Á let ¤Ç̾Á°¤¬Í¿¤¨¤é¤ì¤ë¼° (let x = ... ¤Î ... Éôʬ) ¤¬ÃͤǤ¢¤ë¤È¤¤Î¤ß¡¤¤½¤ÎÊÑ¿ô(x)¤¬Â¿ÁêŪ¤Ë»È¤¨¤ë¤³¤È¤ò¸«¤¿¡¥¤³ ¤³¤Ç¤Ï¡¤¤½¤ÎÀ©¸Â¤ÎÍýͳ¤òÀâÌÀ¤¹¤ë¡¥
¤Þ¤º¤Ï¡¤ÃÍ¿Áê¤ÎÀ©¸Â¤¬¤Ê¤«¤Ã¤¿¤È²¾Äꤷ¤Æ¤ß¤è¤¦¡¥°Ê²¼¤Ï²¾ÁۤΠObjective Caml ¥»¥Ã¥·¥ç ¥ó¤Ç¤¢¤ë¡¥¤Þ¤º¤Ï¶õ¥ê¥¹¥È¤Ø¤Î»²¾È¤òÄêµÁ¤¹¤ë¡¥
# let x = ref [];;
val x : 'a list ref = {contents=[]}
»²¾È x ¤Ë³ÊǼ¤µ¤ì¤Æ¤¤¤ë¤Î¤Ï¶õ¥ê¥¹¥È¤Ç¤¢¤ë¤Î¤Ç¡¤¤½¤Î ÆâÍÆ¤ÏÍÍ¡¹¤ÊÍ×ÁÇ¤È cons ¤Ç¤¤ë¡¥
# (2 :: !x, true :: !x);; - : int list * bool list = ([2], [true])
¤Þ¤¿¡¤¤É¤ó¤Ê¥ê¥¹¥È¤Ç¤âÂåÆþ¤Ç¤¤ë¤Ï¤º¤Ç¤¢¤ë¡¥
# x := [1];; - : unit = ()
¤·¤«¤·¡¤Àè¤Û¤É¤ÏÀµ¤·¤«¤Ã¤¿¼° true :: !x ¤¬¡¤¤Ê¤ó¤Èº£²ó¤Ï true ¤ò [1] ¤Ë cons ¤·¤è¤¦¤È¤·¤Æ¤·¤Þ¤¦¡¥
# true :: !x;; ??
¤³¤Î¸½¾Ý¤Ï¡¤¤¿¤Àñ¤Ëlet ¤ÇÄêµÁ¤µ¤ì¤ë±¦Êդμ°¤Î·¿¤Ë ref ¤¬ Æþ¤Ã¤Æ¤¤¤ë¤«¤é¡¤¤È¤¤¤¦¤ï¤±¤Ç¤Ï¤Ê¤¤¡¥Î㤨¤Ð¡¤°Ê²¼¤Î¤è¤¦¤Ê¥×¥í¥°¥é¥à¤Ç ¾å¤ÈƱÍͤʤ³¤È¤¬¤Ç¤¤Æ¤·¤Þ¤¦¡¥
# let (get, set) =
let r = ref [] in
((fun () -> !r), (fun x -> r:=x));;
val get : unit -> 'a list = <fun>
val set : 'a list -> unit = <fun>
# 1 :: get ();;
- : int list = [1]
# "abc" :: get ();;
- : string list = ["abc"]
# set ["abc"];;
- : unit = ()
# 1 :: get ();;
??
¤³¤Î¤è¤¦¤Ê¥×¥í¥°¥é¥à¤¬Îɤ¯¤Ê¤¤Íýͳ¤Ï¡¤±¦ÊÕ¤¬»²¾È¤òÀ¸À®¤¹¤ë¤è¤¦¤Ê¼° ¤Ç¤¢¤ê¡¤¤«¤Ä¡¤À¸À®¤µ¤ì¤ë»²¾È¤Î·¿¤Ë·¿ÊÑ¿ô¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¤¿¤á¤Ç¤¢¤ë¡¥ ¤³¤Î¤è¤¦¤Ê¾ì¹ç¡¤let ¤Î¸å¤Ç·¿ÊÑ¿ô¤¬Ê£¿ô¤Î·¿¤Ë¶ñÂ⽤µ¤ì¤Æ¤·¤Þ¤¦ ¤³¤È¤Ç¡¤»²¾È¤Ë³ÊǼ¤·¤¿Ãͤ¬Ê̤η¿¤È¤·¤Æ¼è¤ê½Ð¤µ¤ì¤Æ¤·¤Þ¤¦¤³¤È¤Ë¤Ê¤ë¡¥ »÷¤¿¤è¤¦¤ÊµÄÏÀ¤¬¹¹¿·²Äǽ¥ì¥³¡¼¥É¡¦ÇÛÎó¤ËÂФ·¤Æ¤â²Äǽ¤Ç¤¢¤ë¡¥
¤³¤Î»öÂÖ¤òËɤ°¤¿¤á¤Ë Objective Caml (µÚ¤Ó Standard ML) ¤Ç¤Ï¡¤±¦Êդμ°¤¬»²¾È (¹¹¿·²Äǽ¥ì¥³¡¼¥É¡¦ÇÛÎó)¤òÀ¸À®¤·¤Ê¤¤¤³¤È¤¬¤ï¤«¤Ã¤Æ¤¤¤ë»þ¤Ë¡¤Â¿ÁêÀ¤òµö ¤¹¤³¤È¤Ë¤·¤Æ¤¤¤ë¡¥Í¿¤¨¤é¤ì¤¿¼°¤¬¼Â¹Ô¤Î²áÄø¤Ç»²¾È¤òÀ¸À®¤¹¤ë¤«¤É¤¦¤«¤Ï (¥Á¥å¡¼¥ê¥ó¥°¥Þ¥·¥ó¤ÎÄä»ßÀȽÄê¤ÈƱ¤¸¤¯)·èÄêÉÔǽ¤Ê¤Î¤Ç¡¤ÊݼéŪ¤Ê½½Ê¬¾ò ·ï¤È¤·¤Æ¡Ö±¦ÊÕ¤¬¡¤»²¾È¤òÀ¸À®¤·¤Ê¤¤¤É¤³¤í¤«¡¤¤½¤â¤½¤â·×»»¼«ÂÎȯÀ¸¤¹¤ë¤³ ¤È¤Î¤Ê¤¤¡¤ÃͤǤ¢¤ë¤³¤È¡×¤È¤¤¤¦¾ò·ï¤òºÎÍѤ·¤Æ¤¤¤ë¡¥¤³¤ì¤¬ÃÍ¿Áê¤ÎͳÍè¤Ç ¤¢¤ë¡¥¤³¤³¤Ç¡¤ÃͤȤÏ
¤Ê¤É¤Ç¤¢¤ë¡¥ÃͤǤϤʤ¤¤â¤Î¤Ï
¤Ê¤É¤Ç¤¢¤ë¡¥
¿ÁêÀ¤È»²¾È¤ÎÌäÂê¤Ï¡¤ML ¤ÎȯÌÀ°ÊÍ衤ÃÍ¿Áê¤Ë¸Â¤é¤º¤¤¤í¤¤¤í¤Ê²ò·èºö¤¬ µÄÏÀ¤µ¤ì¤Æ¤¤Æ¤¤¤ë¤¬¡¤Ì¤¤À¤Ë³§¤¬Ç¼ÆÀ¤¹¤ë¤â¤Î¤ÏÆÀ¤é¤ì¤Æ¤¤¤Ê¤¤¡¥
Java ¤Ê¤É¤Î¥ª¥Ö¥¸¥§¥¯¥È»Ø¸þ¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ë¤ª¤±¤ë ¥ª¥Ö¥¸¥§¥¯¥È¤È¤Ï
¤ÎÁȤǤ¢¤ë¤È¹Í¤¨¤ë¤³¤È¤¬¤Ç¤¤ë¡¥Objective Caml¼«ÂΤˡ¤¤½¤Î¤è¤¦¤Ê ¥ª¥Ö¥¸¥§¥¯¥È¤òÄêµÁ¤¹¤ë»ÅÁȤߤ¬¤¢¤ë¤¬¡¤¤³¤³¤Ç¤Ï¡¤¤³¤ì¤Þ¤Ç¤Ë ³Ø¤ó¤Àµ¡¹½¤ò»È¤Ã¤Æ¥ª¥Ö¥¸¥§¥¯¥È¤òÌÏÊ路¤Æ¤ß¤è¤¦¡¥
¤Þ¤º¡¤°Ê²¼¤Î¤è¤¦¤Ê(°ì¼¡¸µ)ÅÀ¥ª¥Ö¥¸¥§¥¯¥È¤ò¹Í¤¨¤ë¡¥
¤³¤Î¤¿¤á¤Ë¡¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤È¤Ê¤ë·¿¤ò ¥á¥½¥Ã¥É¤Î¥ì¥³¡¼¥É·¿¤È¤·¤ÆÄêµÁ¤¹¤ë¡¥Ì¾Á°¤ÎºÇ¸å¤Î I ¤Ï ¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤Ç¤¢¤ë¤³¤È¤ò¼¨¤·¤Æ¤¤¤ë¡¥
# type pointI = {get: unit -> int; set: int -> unit; inc: unit->unit};;
type pointI = get : unit -> int; set : int -> unit; inc : unit -> unit;
ÅÀ¥ª¥Ö¥¸¥§¥¯¥È¤Ï°Ê²¼¤Î¤è¤¦¤ËÄêµÁ¤Ç¤¤ë¡¥ “¥á¥½¥Ã¥É¸Æ¤Ó½Ð¤·” ¤Ï ¥ì¥³¡¼¥É¤ÎÍ×ÁǤòŬÍѤ¹¤ë¤³¤È¤Ç¡¤¼Â¸½¤Ç¤¤ë¡¥
# let p =
let x = ref 0 in
let rec this () =
{get= (fun () -> !x);
set= (fun newx -> x:=newx);
inc= (fun () -> (this ()).set ((this ()).get () + 1))} in
this ();;
val p : pointI = get = <fun>; set = <fun>; inc = <fun>
# p.get();;
- : int = 0
# p.inc();;
- : unit = ()
# p.get();;
- : int = 1
inc ¥á¥½¥Ã¥É¤Ï¼«Ê¬¼«¿È¤Î set ¤È get ¤òÁȤ߹ç¤ï¤»¤Æ¼ÂÁõ¤·¤Æ¤¤¤ë¡¥ ¼«Ê¬¼«¿È¤Î¥á¥½¥Ã¥É¤Î¸Æ¤Ó½Ð¤·¤ÏºÆµ¢¤ò»È¤Ã¤Æ¼ÂÁõ¤·¤Æ¤ª¤ê¡¤this ¤Ï¡Ö¼« ʬ¼«¿È¤Î¥á¥½¥Ã¥É¤ÎÁȡפòɽ¸½¤·¤Æ¤¤¤ë¡¥¤½¤Î°ÕÌ£¤«¤é¤Ï this ¤Ï pointI ·¿ ¤Î¥ì¥³¡¼¥É¤È¤Ê¤ë¤Î¤¬ÍýÁÛ¤À¤¬¡¤¤³¤³¤Ç¤ÏºÆµ¢Åª¤ËÄêµÁ¤·¤Æ¤¤¤ë´Ø·¸¤Ç unit -> pointI ¤È¤¤¤¦´Ø¿ô¤È¤·¤ÆÄêµÁ¤·¤Æ¤¤¤ë¡¥¤è¤Ã¤Æ¥á¥½¥Ã¥ÉÆâ¤Ç »ÈÍѤ¹¤ë¤È¤¤Ë¤Ï this () ¤È¤¤¤¦·Á¤Ç¥ì¥³¡¼¥É¤òµá¤á¤Æ¤«¤é .get ¤Ê¤É¤Ç¥á¥½¥Ã¥É¤òÆÀ¤Æ¤¤¤ë¡¥
¤µ¤Æ¡¤¥¯¥é¥¹¤Ï¥ª¥Ö¥¸¥§¥¯¥È¤òÀ¸À®¤¹¤ë¤¿¤á¤Î¥á¥½¥Ã¥É¼ÂÁõ¤Ç¤¢¤ë¤«¤é¡¤ ¶á»÷Ū¤Ë¤Ï½é´ü¾õÂÖ¤ò°ú¿ô¤È¤·¤Æ¥ª¥Ö¥¸¥§¥¯¥È¤òÊÖ¤¹´Ø¿ô¤È»×¤¨¤ë¡¥
# let pointC x =
let rec this () =
{get= (fun () -> !x);
set= (fun newx -> x:=newx);
inc= (fun () -> (this ()).set ((this ()).get () + 1))} in
this ();;
val pointC : int ref -> pointI = <fun>
# let new_point x = pointC (ref x);;
val new_point : int -> pointI = <fun>
# let p = new_point 2;;
val p : pointI = get = <fun>; set = <fun>; inc = <fun>
# p.inc(); p.get();;
- : int = 3
´Ø¿ô new_point ¤Ï¥³¥ó¥¹¥È¥é¥¯¥¿¤Î¤è¤¦¤ÊƯ¤¤ò¤·¤Æ¤¤¤ë¡¥
¤³¤Î¤è¤¦¤Ë¤·¤Æ¡¤·Ñ¾µ¤Ê¤É¤â¤¢¤ëÄøÅÙ¥×¥í¥°¥é¥ß¥ó¥°¤Ç¤¤ë¡¥Î㤨¤Ð¡¤ ÅÀ¥ª¥Ö¥¸¥§¥¯¥È¤ò·Ñ¾µ¤Ë¤è¤ê³ÈÄ¥¤·¤Æ¿§¤Î¤Ä¤¤¤¿ÅÀ¥ª¥Ö¥¸¥§¥¯¥È (¿·¤·¤¤¥á¥½¥Ã¥É¤È¤·¤Æ¡¤getcolor ¤È¤¤¤¦¥á¥½¥Ã¥É¤ò¹Í¤¨¤ë)¤ò¡¤ ·Ñ¾µ¤¹¤ë¥á¥½¥Ã¥É¤òÆóÅÙµ½Ò¤¹¤ë¤³¤È¤Ê¤¯¡¤ºÆÍøÍѤ¹¤ë¤è¤¦¤ËÄêµÁ ¤¹¤ë¤³¤È¤â²Äǽ¤Ç¤¢¤ë¡¥¤¿¤À¤·¡¤ Objective Caml ¤ÎÀ©¸Â¤«¤éƱ¤¸¥Õ¥£¡¼¥ë¥É̾¤òÊÌ ¤Î¥ì¥³¡¼¥É·¿¤Î¤â¤Î¤È¤·¤ÆÆ±»þ¤Ë¤Ï»È¤¨¤Ê¤¤1¤Î¤Ç¡¤Ê̤Υ᥽¥Ã¥É̾¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¡¤ÈÑ»¨¤Ë¤Ê¤Ã¤Æ¤¯¤ë¡¥
ºÇ½é¤ÎÀâÌÀ¤Ç¤â¿¨¤ì¤¿¤è¤¦¤Ë¡¤ÉûºîÍѤòȼ¤¦·×»»¤Ï¡¤ÉûºîÍѤε¯¤³¤ë½çÈ֤˵¤¤ò¤Ä¤± ¤Æ¥×¥í¥°¥é¥ß¥ó¥°¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥Î㤨¤Ð¡¤°Ê²¼¤Î¤è¤¦¤Ê¥×¥í¥°¥é¥à
# let x = print_string "Hello, " in print_string "World!\n";; Characters 5-6: let x = print_string "Hello, " in ^ Warning Y: unused variable x. Hello, World! - : unit = ()
¤Ç¡¤»×¤Ã¤¿¤È¤ª¤ê¤Î½ÐÎϤ¬ÆÀ¤é¤ì¤ë¤Î¤Ï¡¤x ¤¬Â«Çû¤µ¤ì¤ëÃͤη׻»(¤È¡¤¤½ ¤ì¤Ëȼ¤¦ÉûºîÍÑ)¤¬ in °Ê²¼¤Î·×»»¤è¤ê¤âÁ°¤Ëµ¯¤³¤ë¤¿¤á¤Ç¤¢¤ë¡¥Objective Caml ¤ÇÆÃ¤ËÃí°Õ¤¬É¬ÍפʤΤϡ¤´Ø¿ô¸Æ½Ð¤·¤Ê¤É¤ÎÊ£¿ô¤Î°ú¿ô¤Îɾ²Á½ç½ø¤Ç¤¢¤ë¡¥
# let f x y = 2 in f (print_string "Hello, ") (print_string "World\n");; World Hello, - : int = 2 # (print_string "Hello, ", print_string "World\n");; World Hello, - : unit * unit = ((), ())
¸½ºß¤Î¼ÂÁõ¤Ç¤Ï¡¤¸å¤í¤Î°ú¿ô¤«¤é½ç¤Ëɾ²Á¤¬¹Ô¤ï¤ì¤ë¤¬¡¤Objective Caml ¤Î»ÅÍͤȤ·¤Æ¤Ï ̤ÄêµÁ¤Ê¤Î¤Ç¡¤°ú¿ô¤Î·×»»¤ËÉûºîÍѤòȼ¤¦¤È¤¤Ë¤Ï¡¤let ¤Ê¤É¤òÍѤ¤¤Æ ·×»»½ç½ø¤ò¥×¥í¥°¥é¥àÃæ¤ËÌÀ¼¨Åª¤Ë¤¹¤ë¤Ù¤¤Ç¤¢¤ë¡¥
Objective Caml ¤Ç¤Ï¡¤Ì¿Îá·¿¸À¸ì¤Ë¸«¤é¤ì¤ë¤è¤¦¤ÊÀ©¸æ¹½Â¤¤¬¤¤¤í¤¤¤íÍѰդµ¤ì¤Æ¤¤¤ë¡¥ ¤Þ¤º¡¤¾å¤Î¥×¥í¥°¥é¥à¤Î¤è¤¦¤Ê¡Ö¥³¥Þ¥ó¥ÉÎó¡×¤òɽ¸½¤¹¤ë¤¿¤á¤Î µ¡Ç½¤È¤·¤Æ¡¤
⟨ ¼°1 ⟩; ⟨ ¼°2 ⟩; ⋯; ⟨ ¼°n ⟩
¤È¤¤¤¦·Á¤Î¼°¤¬ÍѰդµ¤ì¤Æ¤¤¤ë¡¥¤³¤Î¼°Á´ÂΤϡ¤⟨ ¼°1 ⟩ ¤«¤é½çÈÖ¤Ëɾ²Á¤ò¹Ô¤¤¡¤⟨ ¼°n ⟩ ¤ÎÃͤòÁ´ÂΤÎÃͤȤ¹¤ë¡¥ ¤Þ¤¿¡¤ÅÓÃæ¤Î¼°¤Î·ë²Ì¤Ï¼Î¤Æ¤é¤ì¤Æ¤·¤Þ¤¦¤Î¤Ç¡¤ ⟨ ¼°n−1 ⟩ ¤Þ¤Ç¤Î¼°¤ÏÄ̾ï¤ÏÉûºîÍѤòȼ¤¦¤â¤Î¤Ç¤¢¤ë¡¥ Objective Caml ¤Ç¤Ï¡¤⟨ ¼°i ⟩ (i < n) ¤¬ unit·¿¤Ç¤Ê¤¤ ¾ì¹ç¤Ë¤Ï warning ¤òȯ¹Ô¤¹¤ë¡¥() ¤Ç¤Ê¤¯¡¤°ÕÌ£¤Î¤¢¤ëÃͤòÊÖ¤¹¼°¤ÎÃͤò¼Î ¤Æ¤Æ¤·¤Þ¤¦¤Î¤Ï¥Ð¥°¤Ç¤¢¤ë¤³¤È¤¬Â¿¤¤¤«¤é¤Ç¤¢¤ë¡¥ ¥×¥í¥°¥é¥Þ¤¬¡¤Ãͤ¬Íפé¤Ê¤¤¤³¤È¤ò³Î¿®¤·¤Æ¤¤¤ë¾ì¹ç¤Ï¡¤ignore ´Ø¿ô¤ò¤Ä ¤«¤Ã¤Æ¡¤ÌÀ¼¨Åª¤Ë¤½¤Î¤³¤È¤ò¼¨¤¹¤³¤È¤¬¿ä¾©¤µ¤ì¤ë¡¥
# ignore;; - : 'a -> unit = <fun> # let print_hello () = print_string "Hello, "; 0;; val print_hello : unit -> int = <fun> # print_hello (); print_string "World";; Characters 0-14: Warning S: this expression should have type unit. print_hello (); print_string "World";;Hello, World- : unit = () # ignore (print_hello ()); print_string "World\n";; Hello, World - : unit = ()
¤Þ¤¿¡¤¥ë¡¼¥×¤Î¤¿¤á¤Î¼°¤È¤·¤Æ¡¤while¼°¡¤for¼°¤¬ÍѰդµ¤ì¤Æ¤¤¤ë¡¥ while¼°¤Ï
while ⟨ ¼°1 ⟩ do ⟨ ¼°2 ⟩ done
¤È¤¤¤¦·Á¤Ç¡¤bool·¿¤Î¼°⟨ ¼°1 ⟩¤Îɾ²Á·ë²Ì¤¬ false ¤Ë¤Ê¤ë¤Þ¤Ç ⟨ ¼°2 ⟩ ¤Îɾ²Á¤ò¹Ô¤¦¡¥¼°Á´ÂÎ¤Ï () ¤òÊÖ¤¹¡¥ for¼°¤Ï
for ⟨ ÊÑ¿ô̾ ⟩ = ⟨ ¼°1 ⟩ to ⟨ ¼°2 ⟩ do ⟨ ¼°3 ⟩ done
¤â¤·¤¯¤Ï
for ⟨ ÊÑ¿ô̾ ⟩ = ⟨ ¼°1 ⟩ downto ⟨ ¼°2 ⟩ do ⟨ ¼°3 ⟩ done
¤È¤¤¤¦·Á¤Ç¡¤¤Þ¤º⟨ ¼°1 ⟩¡¤⟨ ¼°2 ⟩¤òÀ°¿ô n, p ¤Ëɾ²Á¤¹¤ë¡¥¤½¤Î¸å¡¤⟨ ÊÑ¿ô̾ ⟩¤òn, n+1, …, p (downto ¤Î¾ì ¹ç¤Ï n, n−1, …, p)¤Î½ç¤Ë«Çû¤·¤Æ ⟨ ¼°3 ⟩¤òɾ²Á¤¹¤ë¡¥ ⟨ ÊÑ¿ô̾ ⟩¤Î͸úÈϰϤÏ⟨ ¼°3 ⟩¤Ç¤¢¤ë¡¥¼°Á´ÂΤÎÃÍ¤Ï () ¤Ç ¤¢¤ë¡¥
¤³¤ì¤é¤Î¥ë¡¼¥×¤òɽ¸½¤¹¤ë¼°¤Ï¡¤ÉûºîÍѤòȼ¤ï¤Ê¤¤¤È¤Þ¤Ã¤¿¤¯°ÕÌ£¤¬¤Ê¤¤¤³¤È¤ËÃí °Õ¤¹¤ë¤³¤È¡¥ÉûºîÍѤ¬¤Ê¤±¤ì¤Ð¡¤while ¤Î·«¤êÊÖ¤·¾ò·ï¤Î¼°¤Ï¾ï¤Ë Ʊ¤¸ÃͤòÊÖ¤¹¤·¡¤for ¼°¤â·×»»¤ò¤¤¤¯¤é¤«·«¤êÊÖ¤·¤Æ () ¤òÊÖ¤¹¤À¤±¤Ç¤¢¤ë¡¥
°Ê²¼¤Ï¥¡¼¥Ü¡¼¥É¤«¤éÆþÎϤµ¤ì¤¿¹Ô¤òÆó¤Ä¤Ä¤Ê¤²¤Æ²èÌ̤˽ÐÎϤ·ÊÖ¤¹ ´Ø¿ô¤Ç¤¢¤ë¡¥½ªÎ»¤Ë¤Ï¥Ô¥ê¥ª¥É¤À¤±¤«¤é¤Ê¤ë¹Ô¤òÆþÎϤ¹¤ë¡¥
# let parrot () =
let s = ref "" in
while (s := read_line (); !s <> ".") do
print_string !s;
print_endline !s;
done;;
val parrot : unit -> unit = <fun>
print_endline ´Ø¿ô¤Ï°ú¿ô¤Îʸ»úÎó¤Ë²þ¹Ô¤ò¤Ä¤±¤Æ½ÐÎϤ¹¤ë¤¿¤á¤Î ´Ø¿ô¤Ç¤¢¤ë¡¥
Îã³°(exception)¤Ï¡¢·×»»¤ò¿Ê¤á¤Æ¤¤¤¯²áÄø¤Ç¤Ê¤ó¤é¤«¤ÎÍýͳ¤Ç·× »»¤òÃæÃǤ»¤¶¤ë¤ò¤¨¤Ê¤¤¾õ¶·¤òɽ¸½¤¹¤ë¤¿¤á¤Î»ÅÁȤߤǤ¢¤ë¡£¤Ê¤ó¤é¤«¤ÎÍýͳ ¤ÎÎã¤È¤·¤Æ¤Ï¡¢0¤Ç¤Î½ü»»¡¢¥Ñ¥¿¡¼¥ó¥Þ¥Ã¥Á¤Î¼ºÇÔ¡¢¥Õ¥¡¥¤¥ë¤Î¥ª¡¼¥×¥ó¤Î¼º ÇÔ¡¢¤Ê¤Éŵ·¿Åª¤Ë¤Ï¼Â¹Ô»þ¥¨¥é¡¼¤ÎȯÀ¸¤·¤¿¾õ¶·¤¬Â¿¤¤¡£´ðËÜŪ¤Ë¤ÏÎã³°¤¬È¯ À¸¤¹¤ë¤È»Ä¤ê¤Î·×»»¤ò¤»¤º¤ËÃæÃǤ·¤ÆÃͤòÊÖ¤µ¤º¼Â¹Ô¤ò½ªÎ»¤·¤Æ¤·¤Þ¤¦¡£(¥¤ ¥ó¥¿¥é¥¯¥Æ¥£¥Ö¥³¥ó¥Ñ¥¤¥é¤Ç¤ÏÆþÎÏ¥×¥í¥ó¥×¥È¤ËÌá¤ë¡£) Î㳰ȯÀ¸¤Ï Objective Caml ¼°¤¬¤½¤Î·¿¤ÎÃͤòÊÖ¤µ¤Ê¤¤Í£°ì¤ÎÎã¤Ç¤¢¤ë¡£
°Ê²¼¤ÏÎã³°¤òȯÀ¸¤¹¤ë¼°¤Ç¤¢¤ë¡£2ÈÖÌܤμ°¤Ï¥Õ¥¡¥¤¥ë¤ò³«¤¯¤¿¤á¤Î´Ø¿ô¤¬¸Æ¤Ó½Ð¤µ ¤ì¤Æ¤¤¤ë¤¬¡¤¥Õ¥¡¥¤¥ë¤¬¤Ê¤¤¤È¤¤¤¦Îã³°¤¬È¯À¸¤·¤Æ¤¤¤ë¡¥ºÇ¸å¤Î¼°¤Ç¤Ï¡¢4 / 0 ¤Î·ë²Ì¤Î½ÐÎϤÀ¤±¤Ç¤Ê¤¯»Ä¤ê¤Î·×»»¤Ç¤¢¤ëʸ»úÎó¤Î½ÐÎϤ¬¹Ô¤ï¤ì¤º¤Ë¼Â¹Ô¤¬ÃæÃǤµ ¤ì¤Æ¤¤¤ë¤³¤È¤¬¤ï¤«¤ë¤À¤í¤¦¡£
# hd [];;
Exception: Match_failure ("", 66, 7).
# open_in "";;
Exception: Sys_error ": No such file or directory".
# print_string (string_of_int (4 / 0)); print_string "not printed";;
Exception: Division_by_zero.
¤½¤ì¤¾¤ì¡¢¥Ñ¥¿¡¼¥ó¥Þ¥Ã¥Á¥ó¥°¤¬¼ºÇÔ¤·¤¿¤³¤È¤ò¼¨¤¹Match, OS¤ËÂФ¹¤ë¥·¥¹¥Æ¥à¥³¡¼¥ë´ØÏ¢¤Î¥¨¥é¡¼¤¬È¯À¸¤·¤¿¤³¤È¤ò¼¨¤¹Sys_error, 0¤Ç¤Î½ü»»¤¬È¯À¸¤·¤¿¤³¤È¤ò¼¨¤¹Division_by_zero, ¤¬È¯À¸¤·¤Æ¤¤¤ë¡£¤Þ¤¿¡¢¤¤¤¯¤Ä¤«¤ÎÎã³°¤Ç¤ÏÎã³°¤Î̾Á°¤Î¤¢¤È¤ËObjective Caml¤Î Ãͤ¬Éղäµ¤ì¤ÆÎã³°¤Ë´Ø¤¹¤ë¾Ü¤·¤¤¾ðÊó¤òÄ󶡤·¤Æ¤¤¤ë¡£
Objective Caml ¤Ç¤Ï¡¢¥×¥í¥°¥é¥Þ¤¬¿·¤·¤¤Îã³°¤òÀë¸À¡¢¤½¤ÎÎã³°¤òȯÀ¸¤µ¤»¤ë¤³¤È¤¬¤Ç ¤¤ë¡£¤Þ¤¿¡¢Îã³°¤ÎȯÀ¸¤ò¥×¥í¥°¥é¥àÃæ¤Ç¸¡ÃΤ·¡¢ÃæÃǤµ¤ì¤ëÁ°¤Ë½èÍý¤òºÆ³« ¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡£
¿·¤·¤¤Îã³°¤ÎÀë¸À¤Ï exception Àë¸À¤Ç¹Ô¤¦¡£
# exception Foo;; exception Foo
Îã³°¤Î̾Á°¤Ï¡¢¥ô¥¡¥ê¥¢¥ó¥È·¿¤Î¥³¥ó¥¹¥È¥é¥¯¥¿¤ÈƱÍÍ¡¢±ÑÂçʸ»ú¤Ç »Ï¤Þ¤é¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£Îã³°¤òȯÀ¸¤µ¤»¤ë¤Î¤Ï raise ¼°¤Ç¹Ô¤¦¡£
# raise Foo;; Exception: Foo.
raise ¼°¤Ï¡¢ÃͤòÊÖ¤µ¤º¤ËÎã³°¤òȯÀ¸¤µ¤»¤ë¤Î¤Ç¡¢Ç¤°Õ¤Î¾ì½ê¤Ç ÍѤ¤¤ë¤³¤È¤¬¤Ç¤¤ë¡£Ê̤θÀ¤¤Êý¤ò¤¹¤ë¤È raise ¼°¤Ë¤ÏǤ°Õ¤Î·¿ ¤¬Í¿¤¨¤é¤ì¤ë¡£²¼¤Î´Ø¿ôÄêµÁ¤ÎÎã¤Ç¤Ï¡¢raise Foo ¼°¤¬ ¿¿µ¶ÃͤäÀ°¿ô¤ÎɬÍפʾì½ê¤Ç»È¤ï¤ì¤Æ¤¤¤ë¤³¤È¤¬¤ï¤«¤ë¤À¤í¤¦¡£
# let f () = if raise Foo then raise Foo else 3;; val f : unit -> int = <fun>
Àè¤Ë¸«¤¿¡¢Sys_error ¤Î¤è¤¦¤ÊÃͤòȼ¤¦Îã³°¤Ï¡¢Àë¸À»þ¤Ë ²¿¤Î·¿¤ÎÃͤòȼ¤¦¤«¤âÀë¸À¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£°Ê²¼¤ÏÀ°¿ô¤ò ȼ¤¦Îã³°¤ÎÀë¸À¤È raise ¤ÎÎã¤Ç¤¢¤ë¡£
# exception Bar of int;; exception Bar of int # raise (Bar 2);; Exception: Bar 2.
Objective Caml¤Ç¤Ï(raise ¤ÇȯÀ¸¤µ¤»¤ëÁ°¤Î)Îã³°¤Ë¤Ï exn ·¿¤¬Í¿¤¨¤é¤ì¡¢ Âè°ìµé¤ÎÃͤȤ·¤Æ´Ø¿ô¤ËÅϤ·¤¿¤ê¡¢¥Ç¡¼¥¿¹½Â¤¤Ë³ÊǼ¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡£ Ê̤θ«Êý¤ò¤¹¤ë¤È¡¤exception Àë¸À¤Ë¤è¤ê¡¤¿·¤·¤¤¥³¥ó¥¹¥È¥é¥¯¥¿¤¬ exn ·¿¤ËÄɲ䵤ì¤ë¤³¤È¤Ë¤Ê¤ë¡¥ ¤Þ¤¿¥ô¥¡¥ê¥¢¥ó¥È·Á¤ÈƱÍͤ˥ѥ¿¡¼¥ó¥Þ¥Ã¥Á¤Ç¡¢Îã³°¥³¥ó¥¹¥È¥é¥¯¥¿¤¬ ŬÍѤµ¤ì¤¿Ãͤò¼è¤ê½Ð¤¹¤³¤È¤¬¤Ç¤¤ë¡£
# let exnlist = [Bar 3; Foo];;
val exnlist : exn list = [Bar 3; Foo]
# let f = function
Foo -> 0
| x -> raise x;;
val f : exn -> int = <fun>
# f Foo;;
- : int = 0
# f (Bar 4);;
Exception: Bar 4.
¤½¤Î¾¤Î¡¤¤¤¤¯¤Ä¤«¤ÎÄêµÁºÑ¤ÎÎã³°¤ò¾Ò²ð¤·¤Æ¤ª¤¯¡¥ Invalid_argument, Failure ¤Ïʸ»úÎó¤òȼ¤¦Îã³°¤Ç¡¤ ¤¤¤¯¤Ä¤«¤Î¥é¥¤¥Ö¥é¥ê´Ø¿ô¤ÇȯÀ¸¤¹¤ë¡¥Á°¼Ô¤Ï´Ø¿ô°ú¿ô¤¬°ÕÌ£¤ò¤Ê¤µ¤Ê¤¤¾ì¹ç¡¤ ¸å¼Ô¤Ï´Ø¿ô°ú¿ô¤ÏÀµ¤·¤¤¤¬²¿¤é¤«¤ÎÍýͳ¤Ç·×»»¤¬¼ºÇÔ¤·¤¿¾ì¹ç¤ËȯÀ¸¤¹¤ë¡¥ Not_found ¤Ïõº÷¤ò¹Ô¤¦´Ø¿ô¤Ç¡¤Ãµº÷Âоݤ¬¸«¤Ä¤«¤é¤Ê¤«¤Ã¤¿¾ì¹ç¤Ë ȯÀ¸¤µ¤»¤ë¤â¤Î¤Ç¤¢¤ë¡¥ End_of_file ¤Ï¥Õ¥¡¥¤¥ë¤«¤é¤ÎÆþÎÏ´Ø¿ô¤¬¥Õ¥¡¥¤¥ë¤Î½ªÃ¼¤ËÅþ㤷¤¿¾ì¹ç¤Ë ȯÀ¸¤¹¤ë¡¥
Î㤨¤Ð¡¤assoc ´Ø¿ô(5.3ÀỲ¾È) ¤Ï °Ê²¼¤Î¤è¤¦¤ËÄêµÁ¤¹¤ë¤Î¤¬¡¤¤è¤ê¡ÖObjective Caml¤é¤·¤¤¡×ÄêµÁ¤Ç¤¢¤ë¡¥
# let rec assoc a = function
[] -> raise Not_found
| (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: Not_found.
¤Þ¤¿ÄêµÁºÑ¤Î´Ø¿ô¤È¤·¤Æ¡¤Îã³°¤òȯÀ¸¤µ¤»¤ë¤À¤±¤Î´Ø¿ô¡¤invalid_arg, failwith ¤Ê¤É¤âÍѰդµ¤ì¤Æ¤¤¤ë¡¥
# failwith "foo";; Exception: Failure "foo".
¼°¤Îɾ²ÁÃæ¤Ëµ¯¤³¤ëÎã³°¤Ï¡¢¤½¤Î¼ïÎब¤ï¤«¤ë¾ì¹ç¤Ë¤Ï¡¢try¼°¤Ç¡¢ ¸¡ÃΤ·¤Æ¸å½èÍý¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤¤ë¡£try ¼°¤Î°ìÈÌŪ¤Ê·Á¤Ï¡¢ match¼°¤È»÷¤Æ¤¤¤Æ¡¢
try ⟨ ¼° ⟩ with
⟨ ¥Ñ¥¿¡¼¥ó1 ⟩ -> ⟨ ¼°1 ⟩
| ...
| ⟨ ¥Ñ¥¿¡¼¥ón ⟩ -> ⟨ ¼°n ⟩
¤È¤Ê¤ë¡£¤Þ¤º¡¢⟨ ¼° ⟩¤òɾ²Á¤·¡¢Îã³°¤¬È¯À¸¤·¤Ê¤±¤ì¤Ð ¤½¤ÎÃͤòÁ´ÂΤÎÃͤȤ¹¤ë¡£É¾²ÁÅÓÃæ¤ÇÎã³°¤¬ raise ¤µ¤ì¤¿ ¾ì¹ç¤Ë¤Ï¡¢½ç¤Ë¥Ñ¥¿¡¼¥ó¥Þ¥Ã¥Á¤ò¹Ô¤Ã¤Æ¤¤¤¡¢¥Þ¥Ã¥Á¤·¤¿»þÅÀ¤Ç ⟨ ¼°i ⟩¤òɾ²Á¤·¡¢try¼°Á´ÂΤÎÃͤȤʤ롣 ²¿¤â¥Þ¥Ã¥Á¤¹¤ë¤â¤Î¤¬¤Ê¤«¤Ã¤¿¾ì¹ç¤Ë¤Ï¡¢¤â¤È¤â¤ÈȯÀ¸¤·¤¿ Îã³°¤¬ºÆÈ¯À¸¤¹¤ë¡£try ¼°¤ÎÃͤϡ¢⟨ ¼° ⟩, ⟨ ¼°1 ⟩, …, ⟨ ¼°n ⟩ ¤Î¤¤¤º¤ì¤«¤Ë¤Ê¤ë¤Î¤Ç¡¢¤³¤ì¤é¤Î¼°¤Î·¿¤Ï °ìÃפ·¤Æ¤¤¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£
# try 4 + 3 with Division_by_zero -> 9;;
- : int = 7
# try 1 + (3 / 0) with Division_by_zero -> 9;;
- : int = 9
# try 1 + (3 / 0) with Sys_error s -> int_of_string s;;
Exception: Division_by_zero.
# let query_city_phone c =
try assoc c city_phone with Not_found -> "999";;
val query_city_phone : string -> string = <fun>
# query_city_phone "Osaka";;
- : string = "06"
# query_city_phone "Nara";;
- : string = "999"
Îã³°¤Î¸¡ÃΤϡ¤¥¨¥é¡¼½èÍý¤Î´ÑÅÀ¤«¤é¤À¤±¤Ç¤Ï¤Ê¤¯¡¤¤è¤ê¸úΨŪ¤Ê ¼Â¹Ô¤Î¤¿¤á¤ËÍѤ¤¤ë¤³¤È¤â¤Ç¤¤ë¡¥¤¿¤È¤¨¤Ð¡¤À°¿ô¤Î¥ê¥¹¥È¤ÎÍ×ÁǤΠÀѤò·×»»¤¹¤ë¥×¥í¥°¥é¥à¤ò¹Í¤¨¤Æ¤ß¤ë¡¥¤â¤Ã¤È¤âÁÇËѤˤϡ¤
# let rec prod_list = function
[] -> 1
| n :: rest -> n * prod_list rest;;
val prod_list : int list -> int = <fun>
# prod_list [2; 3; 4];;
- : int = 24
# prod_list [4; 0; 2; 3; 4];;
- : int = 0
¤ÈÄêµÁ¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡¥¤·¤«¤·¡¤¤³¤ÎÄêµÁ¤Ï¡¤¥ê¥¹¥È¤Ë 0 ¤¬´Þ¤Þ¤ì¤Æ ¤¤¤¿¾ì¹ç¤Ç¤â¡¤¥ê¥¹¥È¤ÎºÇ¸å¤Þ¤ÇΧµ·¤Ë·×»»¤·¤Æ¤·¤Þ¤¤ÌµÂ̤Ǥ¢¤ë¡¥ ¼¡¤ÎÄêµÁ¤Ï 0 ¤¬½Ð¸½¤·¤¿¤é 0 ¤òÊÖ¤¹¤è¤¦¤Ë¤·¤Æ¡¤0 °Ê¹ß¤ÎÀѤò ·×»»¤·¤Ê¤¤¤è¤¦¤Ë¤·¤Æ¤¤¤ë¤¬¡¤0 °ÊÁ°¤ÎÍ×ÁÇ¤È 0 ¤È¤ÎÀѤò¼è¤Ã¤Æ¤¤¤ë ¤È¤¤¤¦ÌµÂ̤¬¤¢¤ë¡¥
# let rec prod_list = function
[] -> 1
| 0 :: _ -> 0
| n :: rest -> n * prod_list rest;;
val prod_list : int list -> int = <fun>
0 ¤¬½Ð¸½¤·¤¿¾ì¹ç¤Ë¡¤°ìÅÙ¤â³Ý¤±»»¤ò¤·¤Ê¤¤¤è¤¦¤Ë¤¹¤ë ÊýË¡¤È¤·¤Æ¡¤option ·¿¤òÍѤ¤¤ëÊýË¡¤¬¤¢¤ë¡¥
# let rec prod_list_aux = function
[] -> Some 1
| 0 :: _ -> None
| n :: rest ->
(match prod_list_aux rest with None -> None | Some m -> Some (m * n));;
val prod_list_aux : int list -> int option = <fun>
# let prod_list l = match prod_list_aux l with None -> 0 | Some n -> n;;
val prod_list : int list -> int = <fun>
# prod_list [2; 3; 4];;
- : int = 24
# prod_list [4; 0; 2; 3; 4];;
- : int = 0
¤³¤³¤Ç¤Ï¡¤¥ê¥¹¥È¤Ë 0 ¤¬½Ð¸½¤·¤¿¤³¤È¤ò None ¤Çɽ¸½¤·¤Æ¤¤¤ë¡¥¤¿¤·¤«¤Ë¡¤ 0 ¤¬½Ð¸½¤·¤¿¤é¡¤»Ä¤ê¤Î¥ê¥¹¥È¤ÎÀѤò·×»»¤»¤º¤Ë½ªÎ»¤·¤Æ¤¤¤ë¤Î¤À¤¬¡¤ ¥×¥í¥°¥é¥àŪ¤Ë¤Ï¤¢¤Þ¤êÈþ¤·¤¯¤Ê¤¤¡¥¤³¤ì¤òÎã³°¤òÍøÍѤ·¤Æ¡¤ None ¤òÊÖ¤¹Âå¤ï¤ê¤ËÎã³°¤òȯÀ¸¤µ¤»¤ë¤è¤¦¤Ë¤·¤¿¤Î¤¬ºÇ¸å¤ÎÄêµÁ¤Ç¤¢¤ë¡¥
# exception Zero_found;;
exception Zero_found
# let rec prod_list_aux = function
[] -> 1
| 0 :: _ -> raise Zero_found
| n :: rest -> n * prod_list_aux rest;;
val prod_list_aux : int list -> int = <fun>
# let prod_list l = try prod_list_aux l with Zero_found -> 0;;
val prod_list : int list -> int = <fun>
# prod_list_aux [2; 3; 4];;
- : int = 24
# prod_list_aux [4; 0; 2; 3; 4];;
Exception: Zero_found.
# prod_list [2; 3; 4];;
- : int = 24
# prod_list [4; 0; 2; 3; 4];;
- : int = 0
¤³¤Î¤è¤¦¤ËÎã³°¤ÏÂç°è¥¸¥ã¥ó¥×¤ËÁêÅö¤¹¤ë¤³¤È¤ò¼Â¸½¤¹¤ë¤³¤È¤¬¤Ç¤¡¤¤¦¤Þ¤¯ »È¤¦¤È¥×¥í¥°¥é¥à¤ÎºÇŬ²½¡¤²ÄÆÉÀ¤Î¸þ¾å¤Ë¤âÌò¤ËΩ¤ÄÈ¿ÌÌ¡¤ÍðÍѤ¹¤ë¤È¥×¥í ¥°¥é¥à¤ÎÀ©¸æ¤Îή¤ì¤¬Ê¬¤«¤ê¤Ë¤¯¤¯¤Ê¤ë´í¸±À¤â¤¢¤ë¤Î¤ÇÃí°Õ¤·¤Æ»È¤ª¤¦¡¥
Objective Caml ¤Ë¤Ï¡¢ºÇ½é¤Ë¸«¤¿ print_string °Ê³°¤Ë¤âÍÍ¡¹¤ÊÆþ½ÐÎÏÍѤδؿô¤¬ÍѰդµ ¤ì¤Æ¤¤¤ë¡¥
print_char, print_string, print_int, print_float, print_endline, print_newline ¤Ïɸ½à½ÐÎÏ(Ä̾ï¤ÏüËö²èÌÌ)¤Ë°ú¿ô¤ò½ñ¤½Ð¤¹´Ø¿ô¤Ç¤¢¤ë¡¥ ¤½¤ì¤¾¤ì¡¤°ú¿ô¤Î·¿¤¬°Û¤Ê¤Ã¤¿¤ê¡¤ËöÈø¤Î²þ¹Ô¤Î½ÐÎϵ¡Ç½¤¬¤Ä¤¤¤Æ¤¤¤¿¤ê¤¹¤ë¤¬¡¤ ´ðËÜŪ¤Êưºî¤ÏƱ¤¸¤Ç¤¢¤ë¡¥
print ¤ò prerr ¤ËÊѤ¨¤ì¤Ð¡¤É¸½à¥¨¥é¡¼½ÐÎϤ˽ñ¤½Ð¤¹´Ø¿ô¤Ë¤Ê¤ë¡¥
¤Þ¤¿¡¤É¸½àÆþÎÏ(Ä̾ï¤Ï¥¡¼¥Ü¡¼¥É)¤«¤éÆÉ¤ß¹þ¤ß¤ò¹Ô¤¦´Ø¿ô¤Ë¡¤read_line, read_int, read_float ¤¬¤¢¤ë¡¥
Objective Caml ¤Ç¤ÏÆþ½ÐÎÏÀè¤òɽ¸½¤¹¤ë¤Î¤Ë¥Á¥ã¥Í¥ë¤È¤¤¤¦Ãê¾ÝŪ¤Ê³µÇ°¤òÍѤ¤¤Æ¤¤¤ë¡¥ ¥Á¥ã¥Í¥ë¤ÏÄÌ¿®Ï©¤Î¤³¤È¤Ç¡¤¤³¤³¤Ë¸þ¤«¤Ã¤Æ½ñ¤½Ð¤·¤¿¤ê¡¤¤³¤³¤«¤é ÆÉ¤ß¹þ¤ß¤ò¹Ô¤¦¤³¤È¤Ç¡¤¤½¤ÎÀè¤Ë¤Ä¤Ê¤¬¤Ã¤¿²¿¤«(¥Õ¥¡¥¤¥ë¡¤¥Ç¥£¥¹¥×¥ì¥¤) ¤Ë½ñ¤¹þ¤ó¤À¤ê¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡¥¥Á¥ã¥Í¥ë¤Ï¤µ¤é¤Ë¡¤ÆþÎÏÍÑ¡¤½ÐÎÏÍѤΠ¤â¤Î¤Ë¤ï¤«¤ì¤Æ¤ª¤ê¡¤Objective Caml ¤Ç¤Ï¤½¤ì¤¾¤ì¡¤in_channel ·¿¡¤out_channel ·¿ ¤È¤·¤ÆÄêµÁ¤µ¤ì¤Æ¤¤¤ë¡¥¤Þ¤¿¡¤É¸½àÆþÎϤʤɤÏÄêµÁºÑ¤ÎÃͤȤ·¤ÆÍѰդµ¤ì¤Æ¤¤¤ë¡¥
# (stdin, stdout, stderr);; - : in_channel * out_channel * out_channel = (<abstr>, <abstr>, <abstr>)
¥Á¥ã¥Í¥ë¤ËÂФ¹¤ëÆþ½ÐÎϤˤϡ¤input_char, input_line, output_char, output_string ¤Ê¤É¤Î´Ø¿ô¤ÇÆÉ¤ß½ñ¤¤ò¹Ô¤¦¡¥
¤Þ¤¿¡¤¥Õ¥¡¥¤¥ë̾¤«¤é¿·¤¿¤Ê¥Á¥ã¥Í¥ë¤òÀ¸À®¤¹¤ë¤³¤È¤â¤Ç¤¤ë¡¥ ½ÐÎÏÍѤΥÁ¥ã¥Í¥ë¤Ï open_out¡¤ÆþÎÏÍѤΥÁ¥ã¥Í¥ë¤Ï open_in ´Ø¿ô¤Ç ÆÀ¤ë¤³¤È¤¬¤Ç¤¤ë¡¥¤É¤Á¤é¤â¡¤¥Õ¥¡¥¤¥ë̾¤Îʸ»úÎó¤ò°ú¿ô¤È¤·¤Æ¼õ¤±¼è¤ë¡¥ ¤Þ¤¿¡¤»È¤¤½ª¤ï¤Ã¤¿¥Á¥ã¥Í¥ë¤Ï close_out, close_in ´Ø¿ô¤Ç ÊĤ¸¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¤½¤Î¾¤ÎÆþ½ÐÎÏ´Ø¿ô¤Ë¤Ä¤¤¤Æ¤Ï¡¤¥Þ¥Ë¥å¥¢¥ë¤Î 18 ¾Ï¤ò»²¾È¤µ¤ì¤¿¤¤¡¥
¤¤¤¯¤Ä¤«¡¤Ê¸Ë¡¤Ë¤Ä¤¤¤ÆÊ䤷¤Æ¤ª¤¯¡¥°ÊÁ°¤Ë¸«¤¿¤è¤¦¤Ë±é»»»Ò¤Ë¤Ï Í¥Àè½ç°Ì¤¬¤Ä¤¤¤Æ¤¤¤Æ¶¯¤¤¤â¤Î¤«¤é·ë¹ç¤·Éôʬ¼°¤ò¹½À®¤¹¤ë¡¥ Î㤨¤Ð ; ¤Ï if ¤è¤ê¤â·ë¹ç¤¬¼å¤¤¤Î¤Ç¡¤
if false then print_string "a"; print_string "b";;
¤Ï
(if false then print_string "a"); print_string "b";;
¤ÈƱ¤¸°ÕÌ£¤Ç¤¢¤ë¡¥¤Þ¤¿¡¤
if false then print_string "a"; print_string "b" else ();;
¤Ïʸˡ¥¨¥é¡¼¤Ë¤Ê¤Ã¤Æ¤·¤Þ¤¦¡¥(; ¤Þ¤ÇÆÉ¤ó¤À»þÅÀ¤Ç if ¼°¤¬½ª¤ï¤Ã¤¿¤È ȽÃǤ·¤Æ¤·¤Þ¤¦¤¿¤á¤ÇÀè¤Ë¤¢¤ë else ¤Ï¤ß¤Æ¤¯¤ì¤Ê¤¤¡¥)
ʬ¤«¤ê¤Ë¤¯¤¤¤Î¤Ï¡¤if ¤Ê¤ÉÊ£¿ô¤Î¥¡¼¥ï¡¼¥É¤«¤é¹½À®¤µ¤ì¡¤Æ±¤¸Í¥ÀèÅÙ¤ò »ý¤Ä¼°¤¬Æþ¤ì»Ò¤Ë¤Ê¤Ã¤¿¾ì¹ç¤Ç¤¢¤ë¡¥´ðËÜŪ¤Ë¤Ï Objective Caml ¤Îʸˡ¤Ç let, if, match, try, function, fun ¤Î¤è¤¦¤Ë¡¤½ªÃ¼¤ò¼¨¤¹¥¡¼¥ï¡¼¥É ¤¬¤Ê¤¤¤â¤Î¤Ï¡¤¤Ç¤¤ë¸Â¤êÀè¤Þ¤Ç´Þ¤á¤Æ¼°¤Î°ìÉô¤Ç¤¢¤ë¤è¤¦¤ËÆÉ¤Þ¤ì¤ë¡¥Î㤨 ¤Ð¡¤
if a then if b then c else d
¤Ï
if a then (if b then c else d)
¤Î¤³¤È¤Ç¤¢¤ë¡¥Æâ¦¤Î if ¤¬±¦¤Ë¤Ç¤¤ë¸Â¤ê¿¤Ó¤è¤¦¤È¤·¤Æ¤¤¤ë¤Î¤¬¤ï¤«¤ë ¤À¤í¤¦¡¥
¤Þ¤¿¡¤match ¤ÎÆþ¤ì»Ò¡¤Îý½¬ÌäÂê¤Ë¤¢¤ë match ¤È try ¤ÎÁȹç¤ï¤»¤Ï Í×Ãí°Õ¤Ç¤¢¤ë¡¥
match e with A -> match e' with B -> ... | C -> ... | D -> ...
¤Ï D ¤Îʬ´ô¤âÆâ¦¤Î match ¤Î°ìÉô¤È¤·¤Æ¹Í¤¨¤é¤ì¤Æ¤·¤Þ¤¦¤Î¤Ç¡¤ D ¤¬³°Â¦¤Î match ¤Ç¤¢¤ë¤è¤¦¤Ë¤¹¤ë¤Ë¤Ï°Ê²¼¤Î¤è¤¦¤Ë³ç¸Ì¤¬É¬ÍפǤ¢¤ë¡¥
match e with A -> (match e' with B -> ... | C -> ...) | D -> ...
Îý½¬ÌäÂê¤Î try¼°¤â³ç¸Ì¤¬¤Ê¤¤¤ÈºÇ¸å¤Î | _ -> °Ê¹ß¤¬ try ¼°¤Î °ìÉô¤È¸«¤Ê¤µ¤ì¤Æ¤·¤Þ¤¦¤Î¤Ç¤¢¤ë¡¥
Âè4½µ¤ÎÍ¥Àè½ç°Ì¤Îɽ¤È¾å¤Î¥ë¡¼¥ë¤Ç¡¤°ì¸«¤·¤ÆÌÀ¤é¤«¤Ç¤Ê¤¤Éôʬ¼°¤Î·ë¹ç ¤Ï¤ï¤«¤ë¤Ï¤º¤Ç¤¢¤ë¡¥(¥×¥í¥°¥é¥à¤¬¸«¤Ë¤¯¤¯¤Ê¤é¤Ê¤¤ÄøÅ٤˳ç¸Ì¤ò¤Ä¤±¤ë¤Î ¤â¤è¤¤½¬´·¤Ç¤¢¤ë¡¥)
type 'a ref = { mutable contents : 'a };;
´Ø¿ô ref, Á°ÃÖ¥ª¥Ú¥ì¡¼¥¿ !¡¤ÃæÃÖ¥ª¥Ú¥ì¡¼¥¿ := ¤ÎÄêµÁ¤ò¡¤
¥ì¥³¡¼¥É¤Ë´ØÏ¢¤·¤¿Áàºî¤Ç½ñ¤±¡¥
# let x = ref 3;; val x : int ref = contents = 3 # incr x;; - : unit = () # !x;; - : int = 4
# let f = ref (fun y -> y + 1) let funny_fact x = if x = 1 then 1 else x * (!f (x - 1));; val f : (int -> int) ref = contents = <fun> val funny_fact : int -> int = <fun> # f := funny_fact;; - : unit = () # funny_fact 5;; - : int = 120
let fact_imp n =
let i = ref n and res = ref 1 in
while (...) do
...;
i := !i - 1
done;
...;;
# type color = Blue | Red | Green | White;;
type color = Blue | Red | Green | White
# type cpointI = {cget: unit -> int;
cset: int -> unit;
cinc: unit->unit;
getcolor: unit-> color};;
type cpointI =
cget : unit -> int;
cset : int -> unit;
cinc : unit -> unit;
getcolor : unit -> color;
¿§ÉÕ¤ÅÀ¥ª¥Ö¥¸¥§¥¯¥È¤ÏºÂɸ¤Ë²Ã¤¨¡¤¿§¤ò¾õÂ֤Ȥ·¤Æ¤â¤Ä¤È¤¹¤ë¡¥
¤Þ¤¿¡¤cget, cinc ¤Ï pointC ¤Î¥á¥½¥Ã¥É¤ò·Ñ¾µ¤·¡¤
cset ¤ÏºÂɸ¤Î¥»¥Ã¥È¤È¤È¤â¤Ë¿§¤òÇò¤Ë¥»¥Ã¥È¤¹¤ë¤è¤¦¤Ë¼ÂÁõ¤·¤¿¤¤¡¥
°Ê²¼¤¬¤½¤Î»î¤ß¤Ç¤¢¤ë¡¥
# let cpointC x col=
let super = pointC x in
let rec this =
{cget= super.get;
cset= (fun x -> super.set x; col := White);
cinc= super.inc;
getcolor = (fun () -> !col)} in
this;;
val cpointC : int ref -> color ref -> cpointI = <fun>
# let new_cpoint x col = cpointC (ref x) (ref col);;
val new_cpoint : int -> color -> cpointI = <fun>
¤·¤«¤·¡¤¤³¤Î¼ÂÁõ¤Ï¤¦¤Þ¤¯Æ¯¤«¤Ê¤¤¡¥
# let cp = new_cpoint 0 Red;; val cp : cpointI = cget = <fun>; cset = <fun>; cinc = <fun>; getcolor = <fun> # cp.cinc();; - : unit = () # cp.cget();; - : int = 1 # cp.getcolor();; - : color = Redcinc Ãæ¤Ç¤Ï¡¤ºÂɸ¤ò¥»¥Ã¥È¤¹¤ë¤Î¤Ç¿§¤ÏÇò¤Ë¤Ê¤Ã¤Æ¤¤¤Æ¤Û¤·¤¤¤Î¤Ë ¸µ¤Î¤Þ¤Þ¤Ç¤¢¤ë¡¥¤³¤ÎÍýͳ¤ò¥×¥í¥°¥é¥à¤Îµóư¤È¤È¤â¤ËÀâÌÀ¤·¡¤ ¤¦¤Þ¤¯ cinc ¤¬ºîư¤¹¤ë¤è¤¦¤Ë¥×¥í¥°¥é¥à¤ò½ñ¤´¹¤¨¤è¡¥¤¿¤À¤·¡¤ ·Ñ¾µ¤òÌÏÊ路¤¿¤¤¤Î¤Ç¡¤Æ±¤¸¤³¤È¤ò¤¹¤ë¥á¥½¥Ã¥É¤ËÁêÅö¤¹¤ë ´Ø¿ô¤Ï°ìÅÙ½ñ¤¯¤À¤±¤Ç(¾å¤Î super.get ¤Î¤è¤¦¤Ê·Á¤Ç)ºÆÍøÍѤ¹¤ë¤³¤È¡¥
(¥Ò¥ó¥È: pointC ¤ÎÄêµÁ¤ò°Ê²¼¤Î¤è¤¦¤ËÊѹ¹¤¹¤ë¡¥)
# let pointC x this () =
{get= (fun () -> !x);
set= (fun newx -> x:=newx);
inc= (fun () -> (this ()).set ((this ()).get () + 1))};;
val pointC : int ref -> (unit -> pointI) -> unit -> pointI = <fun>
# let new_point x =
let x = ref x in
let rec this () = pointC x this () in
this ();;
val new_point : int -> pointI = <fun>
# let rec change = function
(_, 0) -> []
| ((c :: rest) as coins, total) ->
if c > total then change (rest, total)
else c :: change (coins, total - c);;
Warning P: this pattern-matching is not exhaustive.
Here is an example of a value that is not matched:
([], 1)
.................function
(_, 0) -> []
| ((c :: rest) as coins, total) ->
if c > total then change (rest, total)
else c :: change (coins, total - c)..
val change : int list * int -> int list = <fun>
Í¿¤¨¤é¤ì¤¿(¹ß½ç¤Ë¤Ê¤é¤ó¤À)Ä̲ߤΥꥹ¥È coins ¤È¹ç·×¶â³Û total ¤«¤é
¥³¥¤¥ó¤Î¥ê¥¹¥È¤òÊÖ¤¹¡¥
# let us_coins = [25; 10; 5; 1] and gb_coins = [50; 20; 10; 5; 2; 1];; val us_coins : int list = [25; 10; 5; 1] val gb_coins : int list = [50; 20; 10; 5; 2; 1] # change (gb_coins, 43);; - : int list = [20; 20; 2; 1] # change (us_coins, 43);; - : int list = [25; 10; 5; 1; 1; 1]¤·¤«¤·¡¤¤³¤ÎÄêµÁ¤ÏÀèÆ¬¤Ë¤¢¤ë¥³¥¤¥ó¤ò¤Ç¤¤ë¸Â¤ê»È¤ª¤¦¤È¤¹¤ë¤¿¤á¡¤ ²Äǽ¤Ê¥³¥¤¥ó¤ÎÁȹç¤ï¤»¤¬¤¢¤ë¤È¤¤Ë¤Ç¤â¼ºÇÔ¤·¤Æ¤·¤Þ¤¦¤³¤È¤¬¤¢¤ë¡¥
# change ([5; 2], 16);;
Exception: Match_failure ("", 201, 17).
¤³¤ì¤ò¡¤Îã³°½èÍý¤òÍѤ¤¤Æ²ò¤¬¤¢¤ë¾ì¹ç¤Ë¤Ï½ÐÎϤ¹¤ë¤è¤¦¤Ë¤·¤¿¤¤¡¥
°Ê²¼¤Î¥×¥í¥°¥é¥à¤Î¡¤2¸Ä½ê¤Î ... Éôʬ¤òËä¤á¡¤¥×¥í¥°¥é¥à¤ÎÀâÌÀ¤ò¹Ô¤¨¡¥
let rec change = function
(_, 0) -> []
| ((c :: rest) as coins, total) ->
if c > total then change (rest, total)
else
(try
c :: change (coins, total - c)
with Failure "change" -> ...)
| _ -> ...;;
Objective Caml ¤Ç¤Ï¡¤¥Ð¥Ã¥Á¥³¥ó¥Ñ¥¤¥é ocamlc ¤òÍѤ¤¤Æ Objective Caml ¥×¥í¥°¥é¥à¤ò½ñ¤¤¤¿¥Õ¥¡¥¤¥ë¤«¤é¡¤¼Â¹Ô²Äǽ¥Õ¥¡¥¤¥ë¤òÀ¸À®¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡¥ ¤Þ¤¿¡¤¥×¥í¥°¥é¥à¤òÊ£¿ô¤Î¥Õ¥¡¥¤¥ë¤Ëʬ³ä¤·¤Æ¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤³¤È¤â ¤Ç¤¤ë¡¥¤³¤Î¤È¤¡¤Ê¬³ä¤µ¤ì¤¿Ã±°Ì¤ò¥â¥¸¥å¡¼¥ë¤È¸Æ¤Ö¡¥ Objective Caml ¥é¥¤¥Ö¥é¥ê¤â¥â¥¸¥å¡¼¥ë¤Î·Á¤ÇÄ󶡤µ¤ì¤Æ¤ª¤ê¡¤ ¤½¤Î»ÈÍÑÊýË¡¤ÏƱ¤¸¤Ç¤¢¤ë¡¥
¤Þ¤º¤Ï¡¤¥é¥¤¥Ö¥é¥ê¤Î»ÈÍÑË¡¤ò³Ø¤Ó¤Ê¤¬¤é¡¤´û¸¤Î¥â¥¸¥å¡¼¥ë¤Î »È¤¤Êý¤ò¤ß¤Æ¤æ¤¯¡¥Objective Caml ¤Î¥é¥¤¥Ö¥é¥ê¤Ï¡¤List, Array, Sort ¥â¥¸¥å¡¼¥ë¤Ê¤É¤Î¥Ç¡¼¥¿¹½Â¤¤Ë´Ø¤¹¤ë¤â¤Î¡¤Printf ¤Ê¤É¤ÎÆþ½ÐÎÏ¤Ë ´ØÏ¢¤¹¤ë¤â¤Î¡¤Sys ¥â¥¸¥å¡¼¥ë¤Ê¤É¤Î¡¤OS¤äObjective Caml ½èÍý·Ï¤È¤Î¥¤¥ó¥¿¡¼ ¥Õ¥§¡¼¥¹¤ò¤È¤ë¤¿¤á¤Î¤â¤ÎÅù¤¬ËÉÙ¤ËÍѰդµ¤ì¤Æ¤¤¤ë¡¥¤Ò¤È¤Ä¤Ò¤È¤Ä¤Î ¾Ü¤·¤¤µ¡Ç½¤Ê¤É¤Ï¥Þ¥Ë¥å¥¢¥ë¤Î19¾Ï¤ò¤ß¤Æ¤Û¤·¤¤¡¥¤³¤³¤Ç¤Ï List ¥â¥¸¥å¡¼¥ë¤È Queue ¥â¥¸¥å¡¼¥ë¤òÂêºà¤Ë¤¹¤ë¡¥
¥â¥¸¥å¡¼¥ëÆâ¤Î´Ø¿ô¤Ï¡¤⟨ ¥â¥¸¥å¡¼¥ë̾ ⟩.⟨ ´Ø¿ô̾ ⟩ ¤È¸À¤¦·Á¤Ç ¸Æ¤Ó½Ð¤¹¤³¤È¤¬¤Ç¤¤ë¡¥
# List.length [5; 6; 8];; - : int = 3 # List.concat [[4; 35; 2]; [1]; [9; -4]];; - : int list = [4; 35; 2; 1; 9; -4]
°ÊÁ°¤Ë¤ß¤Æ¤¤¿¥ê¥¹¥ÈÁàºî¤Î¤¿¤á¤Î´Ø¿ô rev, append, map, fold_left, fold_right Åù¤Ï¡¤¤Û¤È¤ó¤É List ¥â¥¸¥å¡¼¥ë¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤ë¡¥
Queue ¥â¥¸¥å¡¼¥ë¤Ï¡¤¤¤¤ï¤æ¤ëÂÔ¤Á¹ÔÎó¤Î ¥Ç¡¼¥¿¹½Â¤¤ò¼ÂÁõ¤·¤¿¤â¤Î¤Ç¡¤¥ê¥¹¥È¤Î¤è¤¦¤ËƱ¼ï¤Î¥Ç¡¼¥¿¤ò¤Þ¤È¤á¤Æ³ÊǼ¤¹¤ë¤Î ¤ËÍѤ¤¤ë¡¥add, take ¤È¤¤¤¦Í×ÁǤòÄɲ᤼è¤ê½Ð¤¹´Ø¿ô¤¬ ÍѰդµ¤ì¤Æ¤¤¤ë¤¬¡¤ÆÃħ¤Ï¡ÖÀèÆþ¤ìÀè½Ð¤·¡×¤Ç¤¢¤ê¡¤add ¤·¤¿½çÈ֤Ǥ·¤« take ¤Ç¤¤Ê¤¤¡¥ Queue ¥â¥¸¥å¡¼¥ë¤Ï¥â¥¸¥å¡¼¥ëÆâ¤Ç t ¤È¤¤¤¦Ì¾Á°¤ÎÆÈ¼«¤Î·¿¤òÄêµÁ¤·¤Æ¤¤¤ë¡¥¤³ ¤Î¾ì¹ç¤Ë¤Ï¡¤¤½¤Î·¿¤Ë¤â¥â¥¸¥å¡¼¥ë̾¤¬¤Ä¤¤¤¿·Á 'a Queue.t ¤Çɽ¤µ¤ì¤ë¡¥
# let q = Queue.create ();; val q : '_a Queue.t = <abstr> # Queue.add 1 q; Queue.add 2 q;; - : unit = () # Queue.take q;; - : int = 1 # Queue.take q;; - : int = 2 # Queue.take q;; Exception: Queue.Empty.
ºÇ¸å¤ËȯÀ¸¤·¤¿Îã³° Empty ¤Ï Queue ¥â¥¸¥å¡¼¥ëÆâ¤ÇÄêµÁ¤µ¤ì¤¿¤â¤Î¤Ç¤¢¤ë¡¥
Ʊ¤¸¥â¥¸¥å¡¼¥ë¤ò»È¤¤Â³¤±¤ë¤È¡¤¤¤¤Á¤¤¤Á¥â¥¸¥å¡¼ ¥ë̾¤ò¤Ä¤±¤ë¤Î¤¬ÌÌÅݤˤʤäƤ¯¤ë¡¥open Àë¸À¤Ïʸ»úÄ̤ê¥â¥¸¥å¡¼¥ë¤ò ¡Ö³«¤¯¡×¤â¤Î¤Ç¡¤¥â¥¸¥å¡¼¥ëÆâ¤ÎÄêµÁ¤¬¥â¥¸¥å¡¼¥ë̾¤Ê¤·¤Ç¥¢¥¯¥»¥¹¤Ç¤¤ë¤è ¤¦¤Ë¤Ê¤ë¡¥
# open List;; # length [3; 9; 10];; - : int = 3
¤³¤Î open Àë¸À¤Ï¡¤open ¤·¤¿»þÅÀ¤Ç¤¹¤Ç¤ËÀë¸À¤µ¤ì¤Æ¤¤¤ëƱ̾¤ÎÄêµÁ¤ò ±£¤·¤Æ¤·¤Þ¤¦¤Î¤Ç¡¤Æ±Ì¾¤ÎÄêµÁ¤òÄ󶡤¹¤ëÊ£¿ô¤Î¥â¥¸¥å¡¼¥ë¤ò³«¤¯¤È¤¤Ë¤Ï ½çÈÖ¤ËÃí°Õ¤·¤¿Êý¤¬¤è¤¤¡¥±£¤µ¤ì¤Æ¤·¤Þ¤Ã¤¿Ì¾Á°¤Ï¡¤·ë¶É¥â¥¸¥å¡¼¥ë̾¤Ä¤¤Î µË¡¤Ç¥¢¥¯¥»¥¹¤¹¤ë¤³¤È¤Ë¤Ê¤ë¡¥
¥é¥¤¥Ö¥é¥ê¡¦¥â¥¸¥å¡¼¥ë¤Ï ocamlc -v ¤ò¼Â¹Ô¤·¤ÆÉ½¼¨¤µ¤ì¤ë¥Ç¥£¥ì¥¯¥È¥ê ¤Ë¥½¡¼¥¹¤¬ÃÖ¤¤¤Æ¤¢¤ë¡¥Î㤨¤Ð Queue ¥â¥¸¥å¡¼¥ë¤Ï(ºÇ½é¤Îʸ»ú¤ò¾®Ê¸»ú¤Ë¤·¤¿) queue.ml ¤Ë¤½¤Î¼ÂÁõ¤¬½ñ¤«¤ì¤Æ¤¤¤ë¡¥ ¤³¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤Ï .mli ¤È¤¤¤¦³ÈÄ¥»Ò¤ò»ý¤Ä¥Õ¥¡¥¤¥ë¤âÃÖ¤«¤ì¤Æ¤¤¤ë¡¥ Î㤨¤Ð¡¤queue.mli ¤ò¸«¤Æ¤ß¤ë¤È¡¤(¥³¥á¥ó¥È¤ò½ü¤¯¤È)
type 'a t exception Empty val create : unit -> 'a t val add : 'a -> 'a t -> unit
¤Ê¤É¡¤¥â¥¸¥å¡¼¥ë¤ÇÄ󶡤µ¤ì¤ë·¿¡¤Îã³°¤ä´Ø¿ô¤Î̾Á°¤¬Îóµó¤µ¤ì¤Æ¤¤¤ë¡¥ ¤Þ¤¿´Ø¿ô¤Ë´Ø¤·¤Æ¤Ï¤½¤Î·¿¤â½ñ¤«¤ì¤Æ¤¤¤ë¡¥
¤³¤Î¥Õ¥¡¥¤¥ë¤Ï Queue ¥â¥¸¥å¡¼¥ë¤Î³°Éô¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹(interface)¤òµ½Ò¤·¤Æ¤ª¤ê¡¤Queue ¥â¥¸¥å¡¼¥ë¤ò»È¤¦¾ì¹ç¤Ë¤Ï(¤½¤Î¼ÂÁõ¤Ë´Ø¤ï¤é¤º)¤³¤Î¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤Ë ½¾¤Ã¤Æ»ÈÍѤ¹¤ë¤³¤È¤¬µá¤á¤é¤ì¤ë¡¥
¡Ö¤½¤Î¼ÂÁõ¤Ë´Ø¤ï¤é¤º¡×¡Ö¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤Ë½¾¤Ã¤Æ¡×¤È¤¤¤¦°ÕÌ£¤Ï¡¤ ¥â¥¸¥å¡¼¥ë¤Î¼ÂÁõ¤È¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹ ¤òÈæ¤Ù¤Æ¤ß¤ë¤È¤ï¤«¤Ã¤Æ¤¯¤ë¡¥Î㤨¤Ð¡¤list.ml ¤Ç¤Ï¡¤chop ¤È¤¤¤¦´Ø¿ô ¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤ë¤Î¤À¤¬¡¤list.mli ¤Ë¤Ï¤½¤Î̾Á°¤Ï½Ð¸½¤·¤Ê¤¤¤¿¤á¡¤ List.chop ¤È¤¤¤¦´Ø¿ô¤ò»ÈÍѤ¹¤ë¤³¤È¤Ï¤Ç¤¤Ê¤¤¡¥¤Þ¤¿¡¤queue.ml ¤Ç¤Ï¡¤ 'a cell ¤È¤¤¤¦·¿¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤ë¤¬¡¤queue.mli ¤Ë¤Ï½Ð¸½¤·¤Ê¤¤¤¿¤á¡¤ ¤³¤Î·¿¤ÎÃͤòºî¤ë¤³¤È¤Ï¤Ç¤¤Ê¤¤¡¥(¤½¤â¤½¤â¡¤¤½¤ó¤Ê·¿¤¬Àë¸À¤µ¤ì¤Æ¤¤¤ë ¤È¤¤¤¦»ö¼Â¤¹¤é¸«¤¨¤Ê¤¤¡¥)¤³¤Î¤è¤¦¤Ë¡¤¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤Ï¡¤¥â¥¸¥å¡¼¥ë ÆâÉô¤Ç¤Î¶É½êŪ¤Ë»È¤¦´Ø¿ô¤ä·¿¤ò±£¤¹¤¿¤á¤Ë»ÈÍѤ¹¤ë¤³¤È¤¬¤Ç¤¤ë¡¥
¤³¤Î´Ø¿ô¤Ê¤ê·¿¤Ê¤ê¤òÄêµÁ¤´¤È±£¤·¤Æ¤·¤Þ¤¦¡¤¤È¤¤¤¦°Ê³°¤Ë¡¤¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤Ë¤è¤ë ¾ðÊó±£ÊäΤ⤦¤Ò¤È¤Ä¤Î·ÁÂ֤Ȥ·¤Æ¡¤¡Ö·¿¤ÎÄêµÁ¤ÎÃæ¿È¡×¤ò±£¤¹¡¤ ¤È¤¤¤¦¤³¤È¤¬¤Ç¤¤ë¡¥Î㤨¤Ð¡¤queue.ml ¤Ç¤Ï¡¤'a t ¤È¤¤¤¦¥¥å¡¼¤Î¥Ç¡¼¥¿¹½Â¤¤ò ɽ¸½¤¹¤ë·¿¤¬¥ì¥³¡¼¥É·¿¤ò»È¤Ã¤ÆÄêµÁ¤µ¤ì¤Æ¤¤¤ë¤¬¡¤queue.mli ¤Ç¤Ï
type 'a t
¤È¤¤¤¦ = °Ê²¼¤¬¤Ê¤¤¤â¤Î¤¬½ñ¤«¤ì¤Æ¤¤¤ë¤À¤±¤Ç¤¢¤ë¡¥¤³¤Î¤è¤¦¤Ë¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤Ë µ½Ò¤¹¤ë¤³¤È¤Ç¡¤ t ¤È¤¤¤¦Ì¾Á°¤Î·¿¤¬Â¸ºß¤¹¤ë¤³¤È¤À¤±¤ò³°¤Ë¸«¤»¡¤¤½¤ì¤¬¼ÂºÝ¤É¤¦ÄêµÁ¤µ¤ì¤Æ¤¤¤ë ¤Î¤«¤ò±£Ê乤뤳¤È¤¬¤Ç¤¤ë¡¥¤³¤¦¤¤¤Ã¤¿±£Êäˤè¤ê¡¤t ¤ò¤¢¤¿¤«¤â¡¤ create, add ¤Ê¤É¤Î´Ø¿ô¤ò¥×¥ê¥ß¥Æ¥£¥Ö¤È¤¹¤ë´ðËÜ·¿¤Î¤è¤¦¤Ë³°Éô¤Ë¸«¤»¤ë¤³¤È¤¬²Äǽ¤Ë¤Ê¤ë¡¥
¤³¤Î¤è¤¦¤Ê¾ðÊó±£ÊäλÅÁȤߤϡ¤ Queue ¤ò»È¤Ã¤Æ¤¤¤ë¥³¡¼¥É¤¬¼ÂÁõ°Í¸¤Ç¤Ï¤Ê¤¤¤È¤¤¤¦¤³¤È¤òÊݾڤǤ¤ë¤Î¤Ç¡¤ ¥½¥Õ¥È¥¦¥§¥¢¤òÉôÉʲ½¤¹¤ëºÝ¤Ë͸ú¤Ç¤¢¤ë¡¥ Î㤨¤Ð¡¤¥¥å¡¼¤òÊ̤Υǡ¼¥¿¹½Â¤¤òÍѤ¤¤Æ¼ÂÁõ¤·¤¿¤¯¤Ê¤Ã¤¿¾ì¹ç¤Ë¤â¡¤ ¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤µ¤¨ÊѤï¤é¤Ê¤¤¤è¤¦¤Ëµ¤¤ò¤Ä¤±¤ì¤Ð¡¤ ¥â¥¸¥å¡¼¥ë¤ò»È¤Ã¤Æ¤¤¤ë¥³¡¼¥É¤òµ¤¤Ë¤»¤º¤Ë¼ÂÁõ¤òÊѹ¹¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡¥
¤â¤Ã¤È¤âñ½ã¤Ê ocamlc ¤Î»ÈÍÑË¡¤Ï¡¤Objective Caml ¤ÎÀë¸À¤ò½ñ¤¤¤¿¥Õ¥¡¥¤¥ë(³ÈÄ¥»Ò¤Ï .ml)¤òÍѰդ·¤Æ¡¤ ¥·¥§¥ë¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¤«¤é
ocamlc -o ⟨ ½ÐÎÏ¥Õ¥¡¥¤¥ë̾ ⟩ ⟨ ¥½¡¼¥¹¥Õ¥¡¥¤¥ë̾ ⟩
¤È¤·¤Æ¥³¥ó¥Ñ¥¤¥é¤ò µ¯Æ°¤¹¤ë¤È¡¤⟨ ½ÐÎÏ¥Õ¥¡¥¤¥ë̾ ⟩ ¤È¤¤¤¦¼Â¹Ô²Äǽ¤Ê¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤ë¡¥ -o ¥ª¥×¥·¥ç¥ó¤ò¾Êά¤¹¤ë¤È a.out ¤È¤¤¤¦Ì¾Á°¤ÇÀ¸À®¤µ¤ì¤ë¡¥
igarashi@zither:text> cat hello.ml let _ = print_string "Hello, World!\n" igarashi@zither:text> ocamlc hello.ml igarashi@zither:text> a.out Hello, World! igarashi@zither:text> cat fact.ml let rec fact n = if n = 0 then 1 else n * fact (n - 1) let _ = print_int (fact 10) igarashi@zither:text> ocamlc -o fact10 fact.ml igarashi@zither:text> ./fact10 3628800igarashi@zither:text>
¥Ð¥Ã¥Á¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤ë¥Õ¥¡¥¤¥ë¤ÎÃæ¤Ë¤ÏÀë¸À¤ÎʤӤÀ¤±¤¬µö¤µ¤ì¡¤ ¥¤¥ó¥¿¥é¥¯¥Æ¥£¥Ö¥³¥ó¥Ñ¥¤¥é¤Ç¸«¤¿¤è¤¦¤Ê¡¤¼°¤À¤±¤«¤é¤Ê¤ë¤â¤Î¤Ï ¤Ï¤¸¤«¤ì¤ë¤Î¤Ç¡¤ let _ = ... ¤Î¤è¤¦¤Ê¡¤¼°¤òɾ²Á¤·¤Æ·ë²Ì¤ò¼Î¤Æ¤ëÀë¸À¤È¤·¤Æµ½Ò¤·¤Æ¤¤¤ë¡¥ (C ¤Î main ´Ø¿ô¤ËÁêÅö¤¹¤ë¤â¤Î¤¬¤Ê¤¯¡¤¤¿¤Àñ¤Ë¾å¤«¤éɾ²Á¤ò¹Ô¤Ã¤Æ¤¤¤¯¡¥) ¤Þ¤¿¡¤.ml ¤ËÂбþ¤¹¤ë .mli ¥Õ¥¡¥¤¥ë¤¬¤¢¤ë¾ì¹ç¤Ï¡¤ ¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤Ë½¾¤Ã¤Æ¼ÂÁõ¤¬¤µ¤ì¤Æ¤¤¤ë¤«¤Î¸¡ºº¤Ê¤É¤â¹Ô¤ï¤ì¤ë¡¥
¤µ¤Æ¡¤ºÇ½é¤Ë½Ò¤Ù¤¿¤è¤¦¤Ë¥½¡¼¥¹¥Õ¥¡¥¤¥ë¤ÏÊ£¿ô¤Î¥Õ¥¡¥¤¥ë¤Ëʬ³ä¤¹¤ë¤³¤È¤¬ ¤Ç¤¤ë¡¥Objective Caml ¥·¥¹¥Æ¥à¤Ç¤Ï¡¤°ì¤Ä°ì¤Ä¤Î¥½¡¼¥¹¥Õ¥¡¥¤¥ë¤¬¥â¥¸¥å¡¼¥ë¤Ë Âбþ¤·¡¤UNIX ¾å¤Ç¤Î¥Õ¥¡¥¤¥ë̾¤ÎÀèÆ¬¤òÂçʸ»ú¤Ë¤·¤¿¤â¤Î¤¬¡¤Objective Caml ¤Ç¤Î ¥â¥¸¥å¡¼¥ë̾¤Ë¤Ê¤ë¡¥Î㤨¤Ð¡¤ foo.ml ¤Î¥½¡¼¥¹¥Õ¥¡¥¤¥ëÃæ¤ÎÀë¸À¤Ï¡¤Â¾¤Î¥Õ¥¡¥¤¥ë¤«¤é¤Ï¡¤¥â¥¸¥å¡¼¥ë Foo ¤Ë¤¢¤ë¤â¤Î¤È¤·¤Æ¥¢¥¯¥»¥¹¤µ¤ì¤ë¡¥²¼¤Ï¡¤fact.ml ¤È main.ml ¤Ç¤¢¤ë¡¥
igarashi@zither:samples> cat fact.ml let rec fact n = if n = 0 then 1 else n * fact (n - 1) igarashi@zither:samples> cat main.ml (* main.ml *) let _ = print_int (Fact.fact 10); print_newline();
main.ml ¤Ç¤Ï Fact ¥â¥¸¥å¡¼¥ëÆâ¤Î fact ´Ø¿ô¤ò Fact.fact ¤È¤¤¤¦ ̾Á°¤Ç»ÈÍѤ·¤Æ¤¤¤ë¡¥¥³¥ó¥Ñ¥¤¥é¤Ë¤Ï¡¤Æó¤Ä¤Î¥Õ¥¡¥¤¥ë̾¤ò¡¤ °Í¸¤µ¤ì¤Æ¤¤¤ë¤â¤Î¤«¤é½ç¤Ëʤ٤롥
igarashi@zither:samples> ocamlc -o fact10 fact.ml main.ml igarashi@zither:samples> fact10 3628800
¤Þ¤¿¡¤-c ¥ª¥×¥·¥ç¥ó¤òÍѤ¤¤ë¤È¡¤³Æ¥â¥¸¥å¡¼¥ë¤ò¸ÄÊ̤˥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤³ ¤È¤¬¤Ç¤¤ë¡¥Ãæ´ÖŪ¤Ê¥ª¥Ö¥¸¥§¥¯¥È¥Õ¥¡¥¤¥ë¤È¤·¤Æ¡¤.cmi ¤È¤¤¤¦³ÈÄ¥»Ò¤ò »ý¤Ä¡¤¥â¥¸¥å¡¼¥ë¤Î¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¾ðÊó(¥â¥¸¥å¡¼¥ëÆâ¤Ë¤É¤ó¤Ê̾Á°¤Î´Ø¿ô ¤¬¤É¤ó¤Ê·¿¤ÇÀë¸À¤µ¤ì¤Æ¤¤¤ë¤«¤Î¾ðÊ󡦥·¥°¥Í¥Á¥ã¤È¤â¸Æ¤Ö)¤ò¥³¥ó¥Ñ¥¤¥ë¤· ¤¿¥Õ¥¡¥¤¥ë¤È¡¤.cmo ¤È¤¤¤¦³ÈÄ¥»Ò¤ò»ý¤Ä¥â¥¸¥å¡¼¥ë¼«ÂΤò¥³¥ó¥Ñ¥¤¥ë¤·¤¿ ¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤ë¡¥.cmi ¥Õ¥¡¥¤¥ë¤Ï¡¤¤½¤Î¥â¥¸¥å¡¼¥ë¤ò»ÈÍѤ¹¤ë¥Õ¥¡ ¥¤¥ë¤¬¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤ë¤È¤¤ËɬÍפǤ¢¤ê¡¤(.cmo ¼«ÂΤÏɬÍפǤϤʤ¤¡¥) ²¼¤ÎÎã¤Ç¡¤main.ml ¤òÀè¤Ë¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤³¤È¤Ï¤Ç¤¤Ê¤¤¡¥(¤Þ¤¿¡¤¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹ÄêµÁ¥Õ¥¡¥¤¥ë¤¬¤¢¤ë¾ì¹ç¤Ë¤Ï¡¤¤½¤ì¤òÀè¤Ë¥³¥ó¥Ñ¥¤¥ë¤¹¤ëɬÍפ¬¤¢¤ë¡¥)¤½¤·¤Æ¡¤.cmo ¤Ï¤¢¤È¤Ç¥ê¥ó¥¯¤·¤Æ¼Â¹Ô²Äǽ¥Õ¥¡¥¤¥ë¤òÀ¸À®¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡¥
igarashi@zither:samples> ocamlc -c fact.ml igarashi@zither:samples> ocamlc -c main.ml igarashi@zither:samples> ocamlc -o fact10 fact.cmo main.cmo
³Æ¥â¥¸¥å¡¼¥ë¤Î¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤Ï -i ¥ª¥×¥·¥ç¥ó¤Çɸ½à½ÐÎϤ˽ñ¤½Ð¤¹¤³¤È¤¬¤Ç ¤¤ë¡¥
igarashi@zither:samples> ocamlc -i -c fact.ml val fact : int -> int
¥×¥í¥°¥é¥Þ¤Ï¤³¤ì¤ò¸«¤Æ¡¤³Æ´Ø¿ô¤Ë°Õ¿ÞÄ̤ê¤Î·¿¤¬Í¿¤¨¤é¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«¤ò ³Îǧ¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡¥
This document was translated from LATEX by HEVEA.