LoginSignup
6
3

More than 5 years have passed since last update.

OCaml超入門 ― 導入と文法

Last updated at Posted at 2017-04-11

OCaml超入門

某大学課題でOCamlを使うことになったので導入から簡単な文法まで

OCamlとは

強い静的型付け言語です。Oが大文字ぐらいには知識がありますよね?

導入

Ubuntu環境ではOCamlと入力したらいけそう。OSXだとこちらの記事を参照。

$ brew install rlwrap
$ echo 'alias ocaml="rlwrap ocaml"' >> ~/.bashrc

こうするとctrl + lでコンソールをクリアできたりして便利に使えるようになる。

文法

すでにプログラミング言語を1つ以上知っている方を想定します。おそらくそのプログラミング言語と(大きく)異なる点は

イコールの処理

OCamlではイコールひとつで真偽値判定をします。たとえばif n = 0 then A else Bという形をしています。

整数と浮動小数点数についての演算子の違い

浮動小数点数同士の演算では+/の代わりに+./.を使います。ただしイコールはどちらも=です。

否定

OCamlでは否定はnot Aで表します。

関数の宣言

無名関数の宣言は

fun x -> x * x;;

のようにすればよいです。これをfという名前の関数にしたいのであれば

let f = fun x -> x * x;;

とすればよいですね。実際f 10100を返します。

名前をつけたいのであれば最初から

let f x = x * x;;

とするのが簡単ですね。この内部構造が上記のように展開されていると考えたらよさげです。

関数型言語(というかラムダ計算)の特性ですが,関数も値と考えるのですべて定義はletを用います。letで宣言された変数には再代入ができません。

部分適用

Schemeなどと違ってOCamlでは関数の部分適用が可能です。
たとえば

let f x y = x + y;;

としましょう。これは

let f = fun x y -> x + y;;

と等価であり,さらに

let f = fun x -> fun y -> x + y;;

と等価です。

ここで

let g = f 100;;

としますと,gは引数を1つもち,その引数に100を加えた数を返す関数となります。
もともとのfの第一引数に100が入ったと考えてください。

リスト

関連するものとしてタプルがあります。タプルに関しては省略するので各自お調べください。
リストでは同じ型をもつ複数の要素をまとめます。連結リストです。

let list = [1; 2; 3];;

のように各要素を;で区切って宣言されます。先頭に付け加えたいときは

0 :: list;;

としてあげればよく,2つのリストを連結させたいときは

list @ [4; 5];;

としてあげます。

パターンマッチ

すごく面白いのですが書くと長くなるのでここをご参照ください。

再帰関数の書き方

ひとつ具体例をあげましょう。
0からnまでの整数の和を返す関数sum_to nは次のように書かれます。

sum_to.ml
let rec sum_to n = if n = 0 then 0 else n + sum_to (n-1);;

注意すべきは以下の点でしょう。

  • 再帰関数の定義はlet recとする。
  • ;;でステートメントが評価される。
  • 基本的に引数に括弧は不要。sum_to n-1(sum_to n)-1を指すので注意。

続き

OCaml超入門 ― 便利な関数たち

6
3
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3