<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja"> 
  <HEAD>
    <title>Akihito Nagata's Page</title> 
    <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
    <META http-equiv="Content-Style-Type" content="text/css">
    <meta name="keywords" content="akihito,nagata,ocaml,java,unix,linux,postgresql,html,stylesheet,cgi,thesis,type">
    <meta name="description" content="Akihito Nagata,プログラミングやlinuxなどのtips">    
    <meta name="robots" content="all">
    <link rel="stylesheet" href="/~ganat/stylesheet.css" type="text/css">
    <link rel="stylesheet" href="/~ganat/ocaml/ocaml.css" type="text/css">
    <style type="text/css">
      
	
    </style>
  </head>
  <body>
    <table summary="table" border=0 cellspacing=0 cellpadding=0>
	<tr>
	  <td valign="top">
	    <table summary="table" border=0 cellspacing=0 cellpadding=0>
		<tr>
		  <td>
		    <!-- 左上の画像 -->
		    <table summary="table" border=0 cellspacing=0 cellpadding=0>
			  <tr>
			    <td width=10><img alt="*" src="/~ganat/images/borders/pic_border_lt.jpg"></td>
			    <td width=120 style="background-image : url(/~ganat/images/borders/newpic_border_t.gif);">
			      <img alt="*" src="/~ganat/images/borders/white10x10.gif"></td>
			    <td witdh=10><img alt="*" src="/~ganat/images/borders/pic_border_rt.jpg"></td>
			  </tr>
			  <tr>
			    <td><img alt="*" src="/~ganat/images/borders/pic_border_l.jpg"></td>
			    <td><img alt="*" src="<!--#exec cgi="/~ganat/cgi-bin/todayimage.cgi"-->"></td>
			    <td style="background-image : url(/~ganat/images/borders/newpic_border_r.gif);vertical-align : top;">
			      <img alt="*" src="/~ganat/images/borders/white10x10.gif"></td>
			  </tr>
			  <tr>
			    <td><img alt="*" src="/~ganat/images/borders/pic_border_lb.jpg"></td>
			    <td style="background-image : url(/~ganat/images/borders/newpic_border_b.gif);text-align:left;">
			      <img alt="*" src="/~ganat/images/borders/white10x10.gif"></td>
			    <td><img alt="*" src="/~ganat/images/borders/newpic_border_rb.gif"></td>
			  </tr>
		      </table>
		  </td>
		</tr>
		<tr>
		  <td class="menu" valign="top">
		    <!-- MENU -->
		    <div class="menutitle"><img alt="menu" src="/~ganat/images/menutitle.jpg"></div>
		    <div class="menu"><table width="140">
<tr style="text-align : right; "><td><a class="menu" href="/~ganat/index.html">Top Page</a></td></tr>
<tr style="text-align : right; "><td><a class="menu" href="/~ganat/ocaml/ocaml.html">Ocaml</a></td></tr>
<tr style="text-align : right; "><td><a class="menu" href="/~ganat/java/java.html">Java</a></td></tr>
<tr style="text-align : right; "><td><a class="menu" href="/~ganat/diary.html">Theses</a></td></tr>
<tr style="text-align : right; "><td><a class="menu" href="/~ganat/presentation.html">Presentation</a></td></tr>
<tr style="text-align : right; "><td><a class="menu" href="/~ganat/survey/index.html">Survey</a></td></tr>
<tr style="text-align : right; "><td><a class="menu" href="/~ganat/unix/unix.html">Unix Tips</a></td></tr>
<tr style="text-align : right; "><td><a class="menu" href="/~ganat/memo/index.html">Memo</a></td></tr>
<tr style="text-align : right; "><td><a class="menu" href="/~ganat/link.html">LINK</a></td></tr>
<tr style="text-align : right; "><td><a class="menu" href="/~ganat/cgi-bin/nagabbs/nagabbs.cgi">BBS</a></td></tr>
</table>
</div>
		  </td>
		</tr>
	    </table>
	  </td>
	  <td>
      <table summary="table" border=0 cellspacing=0 cellpadding=0>
		<tr>
		  <td valign="top" style="text-align : center;">
		    <!-- 題名 -->
		    <!-- <div class="title">GANAT PAGE</div> -->
		    <img alt="Akihito Nagata's Page" src="/~ganat/images/title.gif">
		  </td>
		</tr>
		<tr>
		  <td>
		    <!-- メイン -->
		    <table summary="table" border=0 cellspacing=0 cellpadding=0>
			<tr>
			  <td width="10"><img alt="|" src="/~ganat/images/borders/vline_t.jpg"></td>
			  <td></td>
			  <td></td>
			</tr>
			<tr>
			  <td style="background-image:url(/~ganat/images/borders/vline.jpg);"><img alt="|" src="/~ganat/images/borders/vline.jpg"></td>
			  <td><div class="main">
    <div class="body">
      <div class="title"><span class="title">簡単なパターンマッチング</span><img alt="rakuda" src="/~ganat/images/rakuda.gif"></div>
	MLの強力な機能のひとつにパターンマッチングがある。パターンマッチングにより条件に依存した関数を定義できる。
	<h1>match式を使う</h1>
	match式の構文は
<pre class="code">
<span class="b">match</span> <span class="i">expr</span> <span class="b">with</span>
  <span class="i">patt 1</span> -&gt; <span class="i">expr 1</span>
| <span class="i">patt 2</span> -&gt; <span class="i">expr 2</span>
.....
| <span class="i">patt n</span> -&gt; <span class="i">expr n</span>
</pre> 
	この文の意味は expr の評価結果がpatt jとマッチするならばexp jを返す。
	<h2>例。</h2>
	フィボナッチ関数
	<pre class="code">
# let rec fib n =
  match n with
  0 -> 1
  | 1 -> 1
  | k -> fib (k - 2) + fib (k - 1);;
val fib : int -> int = &lt;fun&gt;
# fib 6;;
- : int = 13
</pre>
	この例ではまず引数である6がnに入る。最初に6が1に0にマッチするか試され、その次に1とマッチするか試される。しかし、両方ともマッチせず次に変数kとマッチするか試される。変数kは何にでもマッチするのでkとマッチしkに6が束縛され、fib (k - 2) + fib (k - 1)が評価される。つまりパターンマッチングに変数を入れるとワイルドカードとして使える。マッチさせておいてあとで使わない場合には普通"_"を使う。("_"は代入はできるが評価はできない。)
	<h1>functionを使う</h1>
	パターンマッチングはfunctionでも使うことができる。
	functionを使ってfibを定義してみると、
	<pre class="code">
# let rec fib = function 
  0 -> 1
  | 1 -> 1
  | k -> fib (k - 2) + fib (k - 1);;
val fib : int -> int = &lt;fun&gt;
# fib 6;;
- : int = 13
</pre>
	また、マッチする条件を複数書くことができて、
	<pre class="code">
# let rec fib = function 
  0 | 1 -> 1
  | k -> fib (k - 2) + fib (k - 1);;
val fib : int -> int = &lt;fun&gt;
# fib 6;;
- : int = 13
</pre>
	とも書ける。この場合、0または1にマッチしたら1を返すという意味になる。<br>
	 またfunctiontと良く似たものにfunがあるが、
	  <pre class="code">
fun p1 p2 ... pn -> e
</pre>
	  は
	  <pre class="code">
function p1 -> function p2 -> ... function pn -> e
</pre>
	  と等価。
	<h1>不完全なマッチング</h1>
	次のプログラムは引数に文字を取り、それが大文字ならばtrueを返す。
	<pre class="code">
# let is_uppercase = function
  'A' .. 'Z' -> true;;
Characters 19-46:
Warning: this pattern-matching is not exhaustive.
Here is an example of a value that is not matched:
'a'
val is_uppercase : char -> bool = &lt;fun&gt;
# is_uppercase 'C';;
- : bool = true
# is_uppercase 'd';;
Uncaught exception: Match_failure ("", 19, 46).
</pre>
	しかし、引数が大文字で無い場合が定義されていないのでwarningが出される(errorではない)。大文字を引数として適用すればちゃんと動くが、小文字を入れると例外(後述)が発生する。<br>
	  プログラムを書いていて明らかに全ての場合を書く必要がないということがわかるときでも、全ての式にマッチするように書いた方が良い（多分）。上の式を訂正すると、
	  	<pre class="code">
# let is_uppercase = function
  'A' .. 'Z' -> true
 | _ -> false;;
</pre>
      </div>
    </div></td>
			  <td></td>
			</tr>
			<tr>
			  <td><img alt="|" src="/~ganat/images/borders/vline_b.jpg"></td>
			  <td></td>
			  <td></td>
			</tr>
		    </table>
		  </td>
		</tr>
	    </table>
    </td>
  </tr>
  </table>
    <div><a href="/~ganat/old/index.html">前のページはこちら</a></div>
  </body> 
</html>