<!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="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">Ocamlで関数を使う</span><img alt="rakuda" src="/~ganat/images/rakuda.gif"></div>
      <h1>関数の基本</h1>
      Ocamlの関数は"fun"というキーワードを用いて定義される。最初に引数の名前の列が続き、そのあと"->"で区切られbody部分が書かれる。デフォルトでは関数には名前がつかない。名前をつけたいときはletを使う。
      <pre class="code">
# let incr = fun i -> i + 1;;
val incr : int -> int = &lt;fun&gt;  
</pre> 
      型の情報の"-&gt;"は関数であることをあらわしている。ここではint型の値を引数として受け取ってint型の値を返すという意味である。
      <pre class="code">
# incr 2;;
- : int = 3
</pre>
      引数は複数指定することもできる。
<pre class="code">
# let sum = fun i j -> i + j;;
val sum : int -> int -> int = &lt;fun&gt;
# sum 3 4;;
- : int = 7
</pre>
また関数には名前がつけられることが多いため、簡単に
<pre class="code">
# let sum i j = i + j;;
</pre>
と書くこともできる。
      <h1>ネストした関数</h1>
      CやJavaと違ってOcamlは関数の中に関数を書くことができる。
<pre class="code">
# let sum i =
     let sum2 j =
        i + j
     in 
       sum2;;
val sum : int -> int -> int = &lt;fun&gt;
# sum 3 4;;
- : int = 7
</pre>
      ここで変数のスコープはletで定義された変数のスコープはそのbody部分である"in"の中、引数の変数のスコープはその関数のbody部分に限られる。ここで新に定義されたsumは先のsumと同じ動きをする。厳密にはOcamlには多引数関数というものはなく全てこのような1引数の関数に展開される(カリー化という)。つまりsumの型のint -> int -> intはint -> (int -> int)という意味である。
      <pre>
# let a = sum 1;;
val a : int -> int = &lt;fun&gt;
# a 3;;
- : int = 4
</pre>
      <h1>再帰関数</h1>
      再帰した関数を定義するにはletの代わりにlet recを使う。
<pre class="code">
# let rec power i x =
  if  i = 0 then
      1
  else x * (power (i -1 ) x);;
      val power : int -> int -> int = &lt;fun&gt;
# power 2 3;;
- : int = 9
</pre>
let recを使うと新に定義された変数のスコープがその値の定義部分でも参照することができるようになる。<br>
      相互再帰関数を定義したいときはandキーワードを用いる。
      <pre class="code">
# let rec odd x =
    if x = 0 then false
             else even (x - 1)
  and even x = 
    if x = 0 then true
             else odd (x -1);;
val odd : int -> bool = &lt;fun&gt;
val even : int -> bool = &lt;fun&gt;
# odd 4;;
- : bool = false
# even 4;;
- : bool = true
</pre>
      <h1>高階関数</h1>
      Ocamlでは関数も普通の値として扱うことができるため、関数を受け取るような関数を定義することができる。
      <pre class="code">
# let double f x = f (f x);;
val double : ('a -> 'a) -> 'a -> 'a = &lt;fun&gt;
# double (sum 3) 1;;
- : int = 7
</pre>
      doubleは第1引数に引数をひとつ受け取る関数を受け取ってそれを第2引数に２回適用する関数である。sum 3は引数を受け取って3を加える関数とみることができるので第2引数の１に対して"3を足す"という動作が２回繰り返されるので値は7となる。
      <h1>変数名について</h1>
      ocamlの変数には英数字（大文字、小文字どちらでもOK）、"'"、"_"(アンダーバー)を使うことができる。ただし、小文字、もしくはアンダーバーから始まらなくてはならない。
      <h1>中置演算子</h1>
      +,*などは他の関数と違って中置記法(infix)で記述できる。他の関数と同様に前置記法で記述するにはかっこをつける。
<pre class="code">
# (+) 1 2;;
- : int = 3
# ( * ) 3 4;;
- : int = 12
</pre>
      *を前置で書くにはコメントと見なされないために、かっことの間にスペースを入れる必要がある。<br>
      また、
<pre class="code">
# let rec power x y = if y == 0 then 1 else x * power x (y - 1);;
val power : int -> int -> int = <fun>
# let ( ** ) x y = power x y;;
val ( ** ) : int -> int -> int = <fun>
# 3 ** 4;;
- : int = 81
</pre>
      のようにすると新しい中置演算子を作ることができる。
    </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>