Haskell勉強会

関数型プログラミングの学習日記

関数型言語の分類

オブジェクト指向でなぜつくるのか」という本に、関数型言語の説明がありました。

 

オブジェクト指向でなぜつくるのか 第2版

オブジェクト指向でなぜつくるのか 第2版

 

 

目次

(参考)http://ec.nikkeibp.co.jp/item/contents/mokuji/m_P84650.html

オブジェクト指向でなぜつくるのか 第2版 知っておきたいOOP、設計、関数型言語の基礎知識

第1章 オブジェクト指向はソフトウエア開発を楽にする技術
第2章 オブジェクト指向と現実世界は似て非なるもの
第3章 OOPを理解する近道はプログラミング言語の歴史にあり
第4章 OOPは無駄を省いて整理整頓するプログラミング技術
第5章 メモリの仕組みの理解はプログラマのたしなみ
第6章 OOPがもたらしたソフトウエアとアイデアの再利用
第7章 汎用の整理術に化けたオブジェクト指向
第8章 UMLは形のないソフトウエアを見る道具
第9章 現実世界とソフトウエアのギャップを埋めるモデリング
第10章 擬人化して役割分担させるオブジェクト指向設計
第11章 オブジェクト指向から生まれたアジャイル開発とTDD
第12章 オブジェクト指向を使いこなそう
第13章 関数型言語でなぜつくるのか

 

第13章に、関数型言語の説明がありました。

 

第13章 関数型言語でなぜつくるのか

オブジェクト指向の「次」の開発技術

関数型言語の7つの特徴

●特徴1:関数でプログラムを組み上げる

●特徴2:すべての式が値を返す

●特徴3:関数を値として扱える

●特徴4:関数と引数を柔軟に組み合わせることができる

●特徴5:副作用を起こさない

●特徴6:場合分けと再帰でループ処理を記述する

●特徴7:コンパイラが型を自動的に推測する

●7つの特徴のまとめ

関数型言語の分類

関数型言語のメリット

関数型言語の課題

関数型言語オブジェクト指向の関係

関数型言語は普及するのか

 

関数型言語の分類の説明がありました。

 

 (p.349)

関数型言語の分類

 ここで関数型言語の分類について説明しておきましょう。関数型言語は一般的に、型づけ方式と純粋性の2つの軸で分類します。2つの軸による分類と、代表的な言語を表13.4に示します。

 

(p.350)

表13.4 関数型言語の分類と代表的な言語

純粋性\型づけ方式 強い(静的) 弱い(動的)
純粋関数型言語 Haskell、Miranda Lazy K
非純粋関数型言語 ScalaOCaml、F#、ML Common LispSchemeErlang

 

 横軸の型づけ方式は、型チェックの仕組みの違いによる分類です。強い型づけの言語はプログラムのコンパイル時に型チェックを行い、弱い型づけの言語はプログラムの実行時に型チェックを行います。強い型づけ言語の多くは、特徴7で紹介した型推論をサポートします。

 縦軸の純粋性は、その名のとおり関数型言語として純粋であるかどうかの分類です。これを言い換えると、言語仕様として副作用を認めるかどうかの分類とも言えます。基本的に純粋関数型言語では副作用を認めません。これに対して非純粋関数型言語では、言語仕様として副作用を認めます。関数型言語の仕組みを提供する一方で、従来の命令型言語と同様に、変数に値を代入する文法もサポートします。

 ただし純粋関数型言語であっても、画面やネットワークやデータベースなどの外部入出力を実現する必要があります。Haskellではこれをモナドと呼ぶ特殊な仕組みで実現しています。

 

※30 モナドはさまざまな値を格納できる汎用的な容れ物で、Monadという名前の型クラスとして提供されます。入出力処理は「IOモナド」と呼ぶ専用の型に封じ込め、(>>=)という名前の連結関数で入出力の順序を制御します。

 

本書の説明では、関数型言語

  1. 型チェックの仕組み
  2. 純粋性(副作用のサポート)

で分類していました。

 

Erlangは、型チェックが実行時にチェック(動的)で、副作用も言語仕様としてサポートしているグループに分類されていました。

それぞれの特徴を活かした使い方ができればいいですね。