📘

式と評価について(Haskell)

2022/07/06に公開

この記事では式と評価について学びます。Haskellは「プログラムは全て値を返却する式から成り立つ」という点で大きな特徴を持ちます。命令型言語と比較しながらその文法としての特徴を学んでいきましょう。

文と式

プログラミング言語の文法に注目した時、命令型言語は2つの要素から構成されます。文と式です。

文:コンピュータに対する命令
(if文、for文、while文..など)

式:計算を行い値を得る
(変数、関数、真偽値、計算式..など)

文とはコンピュータに対する命令のことです。「〇〇しろ!」と指示を出します。for文:繰り返せ!、if文:判定しろ!なども結局は命令です。式とは値を返す要素のことです。変数、関数、計算式などは何らかの値を得ることができます。(C言語、Java、Pythonなど)命令型言語の多くは2つのミックスによってコードを記述します。

命令型言語:文を中心に構成

例えばC++で1~5の数字を合計するプログラムを書いてみます。「コンピュータに対する命令」という部分と「計算を行い値を得る」という部分に注目して、こちらを見てみて下さい。

#include <iostream>
using namespace std;

int main (){
    int sum = 0;
    int i;
    for(i = 1; i <= 5; i++){
        sum += i;
    }
    cout << sum << "\n";
}

このように「式で必要な計算を進めつつ、文でコンピュータに行ってもらうことを指示する」というのが命令型言語の主な流れとなっています。「命令」という言葉があるように、従来の命令型言語で重要なのは式より文です。

関数型言語:式

それに対して関数型言語では式を中心にプログラムを構成します。文のようにコンピュータへ命令する要素はなく、全てが値を返却する変数、関数、計算式などから構成されています。「式を中心に構成される」ということをイメージするため例を2つ挙げます。1つ目が単純なHaskellにおける式の例です。

max 10 20
x + 10
25
"HelloWorld"

関数適用の結果は値を返却しますし、計算の結果も値を返却します。また25"HelloWorld"といったデータも式として扱われていることに注目して下さい。このように関数型言語ではデータも関数も式として値を返却するようになっています。2つ目の例がifによる判定です。命令型言語でif文は文(コンピュータへの命令)を意味していました。Haskellにはif文ではなくif式というモノがあります。if式を使って「10より大きいか?」を判定したのがこちらです。

keisan :: Int -> String
keisan x =
    if x > 10
        then "10より大きいです"
        else "10以下です”

main = putStrLn $ keisan 20

ここではkeisan関数に20という数値を渡しているため、”10より大きいです”と出力されます。ここで注目したいがの10より大きくても小さくても必ずifから値が返却される点です。 10より大きい場合は"10より大きいです”と文字列が返され、それ以外の場合は"10以下です”と返却されます。if式と呼ぶのは、ifで必ず値を返却するようになっているからです。どちらのパターンでも値を必ず返却するようになっており、これが「全ての式が値を持つ」という例の2つ目です。

式を中心にプログラムを構成

関数型言語(Haskell)は可能な限り式だけでプログラムを作ります。具体的には、値を返す細かな式をたくさん定義してプログラムを組み立てます。モノすごい電卓でプログラムを動かす..と考えても良いでしょう。また式は必ずデータ型を持っていました。プログラムの全体が型付けされることで、より安全で強固にプログラムを作ることができます。

実行と評価

命令型言語は文、関数型言語は式を中心に成り立つことを学びました。2つは全く違う構成要素から成り立つため、それを出力にかける際にも違った呼び方をします。命令型言語を出力にかける場合、多くは「実行する」などと呼んできたと思います。それを関数型言語では「評価する」と呼びます。

命令型言語:文を「実行する」
関数型言語:式を「評価する」

関数型言語は元々、数学の関数や数式をプログラムとして表現するために考案された言語です。個々の式を次々と評価し、そこで得られた値を別の式で評価していく..という流れによってプログラムを組み立てます。コンピュータに対する命令を中心に構成される命令型言語とは全く違う考えで成り立っており、それはプログラムを動かす場合も同じです。

まとめ

■プログラムを構成する中心要素
命令型言語:文(コンピュータへの命令)
関数型言語:式(計算を行い値を得るモノ)

■プログラムを動かすこと
命令型言語:実行する
関数型言語:評価する

Discussion