<!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">TupleとListとポリモーフィズム</span><img alt="rakuda" src="/~ganat/images/rakuda.gif"></div>
      Ocamlには多くの組み込みデータ型があるが、そのうち比較的簡単なtupleとlistをここで扱う。さらにMLで一番楽しいポリモーフィズムもここで解説する。
      <h1>ポリモーフィズム</h1>
      まずポリモーフィズムの例として、恒等関数を定義する。
      <pre class="code">
# let id x = x;;
val id : 'a -> 'a = &lt;fun&gt;
</pre>
      すると、型に"'a"が現れる。これは"どの型でもいい"という意味を表す。よってこの関数はどんな引数も受け付ける。
      <pre class="code">
# id 1;;
- : int = 1
# id "hello";;
- : string = "hello"
</pre>
      一つめの例では引数が１なので"'a"とintがunifyされる。idの返り値の型も"'a"であるので、"id 1"自体の型はintであることがわかる。<br>
      このように型にパラメータとして変数を持てるようなポリモーフィズムをparametric polymorphismという。 
    </div>
    <h2>他の言語と比べてみると</h2>
    ポリモーフィズムはMLの強力さの一つである。C言語のようにポリモーフィズムのない言語では先の恒等関数は
    <pre class="code">
int int_id(int i){
   return i;
}

char *string_id(char *s){
   return s;
}
</pre>
    のように書かなくてはならない。もしくはオーバーロードを用いて、
    <pre class="code">
int id(int i){
   return i;
}

char *id(char *s){
   return s;
}
</pre>
    のように書く。オーバーローディングはadhocポリモーフィズムとも呼ばれる。<br>
    MLにはオーバーローディングはない(オーバーロードしようとすると再定義になる。)。理由としてはMLは型を明示的に書かず推論を行うが、推論とオーバーローディングが重なると推論できない場合が生じる。また、オーバーローディングを許すとどの関数が呼ばれているのかプログラムを読むときにわかりにくいからである。
    <h1>Tuples</h1>
    tuple(タプル=組)は順序つきの値の組合わせを作り出す。<br>
    tupleはカンマで区切られた値のシーケンスで表現される。
    <pre class="code">
# let p = 1, "Hello";;
val p : int * string = 1, "Hello"
</pre>
    上の例は1と"Hello"の組を作り出し、その型は int * string ということを示している(型のシンタックスではtupleの区切りは"*")。<br>
    tupleの中の値を取出すにはパターンマッチングを用いる。
    <pre class="code">
# let p = 1, "Hello";;
val p : int * string = 1, "Hello"
# let x, y = p;;      <span class="cmt">(* pのそれぞれを取出し、x、yに入れる *)</span>
val x : int = 1
val y : string = "Hello"
# let fst (x, _) = x;;<span class="cmt">(* 一つめの要素を取出す関数、組み込みなので定義しなくても使える。*)</span>
val fst : 'a * 'b -> 'a = &lt;fun&gt;
# fst p;;             <span class="cmt">(* 最初の要素である１が取出される *)</span>
- : int = 1
</pre>
    tupleの評価は同時に行われる。値を入れ替えたいときには次のように書く。
    <pre class="code">
# let x,y = y,x;;
val x : string = "Hello"
val y : int = 1
</pre>
    tupleは各要素に名前がつけられないので項目の少ない座標などを表現する場合に適している。
    <h1>Lists</h1>
    リストも同様に値の列を作り出したいときに使われる。ただし、Ocamlではリストの各要素の型は等しくなければならない。<br>
    リストを作るには"["と"]"でくくる。
    <pre class="code">
# [1 ; 2 ; 3];;
- : int list = [1; 2; 3]
</pre>
    また"[]"は空リストを表し、"x::y"はconsを表す。よって上のリストは下のようにも書ける。
    <pre class="code">
# 1 :: 2 :: 3 :: [];;
- : int list = [1; 2; 3]
</pre>
リストの要素を取出すときもパターンマッチングを用いる。<br>
以下はリストの順序を逆にする例と、リストの各要素に関数を適用する例である。
<pre class="code">
# let rec sum lst = <span class="cmt">(* 要素の和を求める(int用)関数 *)</span>
  match lst with
  [] -> 0
  | hd::tl -> hd + sum tl;; 
val sum : int list -> int = <fun>
# sum [ 1; 2; 3; 4];;
- : int = 10
# let rec map f lst = <span class="cmt">(* 各要素に関数を適用する関数 *)</span>
  match lst with
  [] -> []
  | hd::tl -> f hd :: map f tl;;
val map : ('a -> 'b) -> 'a list -> 'b list = <fun>
# map (fun x -> x * x) [1; 2; 3; 4];;
- : int list = [1; 4; 9; 16]
</pre>
リストは値の集合などを扱うときに使われる。リストに対する操作はListライブラリにいろいろ含まれている。
  </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>