SMLによる 関数型言語入門 #1

言語の種類

まずは言語にはどんな種類があるのかを羅列してみる。

※ ここでやるのは関数型MLって言語

関数型言語とは

1. 関数を基本とする

(関数 = 数学で言う関数 != C言語における関数)

定義域と値域の対応付けができる

2. 副作用(式の計算のこと)をできるだけ(あるいは全く)用いない

ex. 変数への値の代入

これは参照透過性と呼ばれる

ML (Meta-Language)

  • 非純粋型関数型言語...副作用を起こすことが可能
  • 強い静的型付け...型推論機能あり
  • SML/NJ (Standard ML of New Jersey)

  • MLの使い方等のリファレンスは以下にまとまっているので参考にさせていただきます。

http://www.momo.cs.okayama-u.ac.jp/~sasakura/jikken/ML/

MLの基本型

MLには5つの基本型があり, 強い静的型付け言語であり思想として型にはとてもストリクトになっている。

  • 整数 - int (1, 100)
  • 実数 - real (1.0, 15.2)
  • 文字 - char (#"A")
  • 文字列 - string ("ABC")
  • ブール - bool (true, false)

SMLの使い方

  • 起動
$ sml
  • 命令
- 1+2;
val it = 3 : int
- 2-3;
val it = ~1 : int

~はマイナスの記号(引き算と負の記号は概念として全く別物!そしてコンパイラ作るのが簡単)

  • 整数の除算
- 4 div 2
  • 実数の除算
- 4.0 / 2.0
  • 変数宣言
val a = 2;
  • 関数宣言
fun <識別子> (<パラメータリスト>) = <式>;
  • 条件分岐
if <条件式> then <式1> else <式2>;

if文は、文と同時に式として扱われるので、if文自体も値を持つ必要がある。else文がないとif文の値が不定になってしまうので必ずelse文が必要(!!)

Cでは制御文だから困惑しそうだけど、関数型ではif文も式として扱う!ということが大事。

練習

Elements of ML Programmingから問題を抜粋してます。

まず、次のように関数を定義する。

val a = 2;
fun f(b) = a*b;
val b = 3;
fun g(a) = a+b;

そしたら次の式の値がどうなるかkkあん

  1. f(4)
  2. f(4)+b
  3. g(5)
  4. g(5)+a
  5. f(g(6))
  6. g(f(7))

答えは以下のようになる。インタプリタでプログラムを動かしてみます。

- f(4);
val it = 8 : int
- f(4)+b
val it = 11 : int
- g(5)
val it = 8 : int
- g(5)+a
val it = 10 : int
- f(g(6))
val it = 18 : int
- g(f(7))
val it = 17 : int

SMLによる関数型言語入門 #2 - 凸ろぐ