プログラミング in OCaml > 第1章 はじめに
1.4 OCamlの特徴 * †
- OCamlは関数型言語
- OCamlは強く型付けされた言語
プログラミング言語の分類 †
(プログラミングより引用)
パラダイム | 分類 | 基礎となる計算モデル | 事例 |
命令型 | 手続き型言語 | チューリングマシン | C, Java |
宣言型 | 問合せ型言語 | 関係モデル | SQL |
関数型言語 | ラムダ計算 | Lisp, Haskell | |
論理型言語 | 一階述語言語 | Prolog |
OCamlは関数型言語 †
関数(function)とは、高校の数学などで習ったf(x)=2x+1みたいな関数や、三角関数sinx、cosxといった関数のことです。
関数型言語の特徴的な考え方は、「プログラムは関数を組み合わせた式」である、ということです。
プログラムの実行は式の値を求めることです。
実際のプログラミングの作業は、例えば上のfのような関数を自分で定義することになります。
関数型言語、関数型プログラミングのメリット †
- プログラムを書くために覚えることが少なくて楽
- プログラムから、その挙動を読み取ったり確かめたりするのが楽
特に二点目は非常に重要です。
ただし、関数型プログラミングで楽をするためには、ひとつだけコツを身に着ける必要があります。
それが「再帰」(recursion)という考え方です。
OCamlは強く型付けされた言語 †
プログラミング言語は、データの型(Type)の扱い方の違いによって、
- 静的型付き言語(statically typed language)
- 動的型付き言語(dynamically typed language)
の2つに分類できます。
プログラミング言語の用語としての「型」の意味は、「プログラム実行中に扱われるデータの種類」です。
(例)
- 整数型:整数の1など
- 文字列型:文字列"abc"など
かけ算や結合といった各種演算に対しては、
「かけ算は整数型のデータふたつに対して行われる」
「結合は文字列のふたつのデータに対して行われる」
といった、演算対象の型に関する約束事が決まっています。
型エラー †
人間に作られたプログラムで、データの型に関する約束事が守られていない場合、プログラム実行時に発生するエラーを型エラー(type error)と呼びます。
- 動的型付き言語では、型の約束事が守られているかを、プログラムを実行しながらチェックしていきます。
- 静的型付き言語では、型の約束事が守られているかを、プログラムを実行する前にチェックします。
静的型検査 †
静的型付き言語におけるプログラム実行前のチェックのことを「静的型検査」(static type checking)といいます。
強い型付けと弱い型付け †
静的型付き言語は、静的型検査の厳密さによって、
- 強く型付けされる言語(strongly typed)
- 弱く型付けされる言語(weakly typed)
に分けられます。
「強く型付けされる」というのは、静的型検査によってプログラムの安全性が保証されることをいいます。
(プログラム実行時に型エラーが起こらない)
「弱く型付けされる」というのは、静的型検査に通ったプログラムでも安全性が保証されるわけではないことをいいます。
C言語は弱く型付けされる言語ですが、JavaやOCamlは強く型付けされる言語です。
多相的型システム †
強く型付けされる言語は、実行できるプログラムの種類を制限することによって安全性を確保しているので、よく「プログラミングの柔軟性が損なわれる」と言われます。
この点、OCamlでは、「多相的型システム」(polymorphic type system)という仕組みによって、かなり高い柔軟性が確保されています。
型推論 †
強く型付けされる言語では、たいていプログラマーが「ここは○○型ですよ」という意味の型宣言をしなければいけません。
(例:Javaの型宣言)
int number; // int型の変数numberを宣言 String str; // String型の変数strを宣言
OCamlでは、プログラマーはこのような型宣言を省略することができます。
その代わりにOCaml(の処理系)が「ここは○○型のはずですね」と型の種類を推論してくれます。
これが「型推論」(type inference)です。
OCamlでは、多相的型システムと型推論によって、できるだけ動的型付き言語に近い感覚でプログラムを書きつつ、安全性を確保することが可能になっています。