式と文
Midoliy |> F#プログラミング

式と文
if式?

式と文


  プログラミングにおける 式(expression) とは、"なんらかの評価した値を返すもの" を指します。 また、1つ以上の "式" で構成され、評価されても値を返さないものを 文(statement) といいます。

 もう少し簡単に説明すると、「式は評価することで値になれるもの」で「文は評価をしても値にならないもの」と言えます。

 F#では、トップレベルでの宣言のみが文で、他はすべてが式です。評価すると値になるということは、つまり、値が書けるところには式を書くことができます。 文にはそれができません。
 前述したとおり、F#は基本的にほとんどすべての機能が式です。そのため、C#やVB.NETでは思いもよらないところに、思わぬコードを書けたりします。 また、式と式を組み合わせることで、手続き型プログラミングでは煩雑になりがちな処理をスッキリと記述することができる場合もあります。
 ほとんどすべての機能が式というのは、思っている以上に強力なのです。今はまだよくとわからない方がいるかもしれませんが、頭の片隅にでも置いておいて、いただければと思います。


if式?


 前項の説明でわかる人ばかりならば、何の問題もないですが、おそらく多くの方はあまりピンッときていないかと思います。 そこで、簡単な例で説明をしていきます。今回は if を使ったもので例を示したいと思います。

 C#やVB.NETなど、ほかの命令型言語を学んだことがあるかたは "if文" というのをご存知かと思います。 F#にも "if" は存在しますが、C#などと違い "文ではなく式" です。そのため、if式 といいます。
 値が書けるところであれば、式が書けるという例を見てみましょう。

 まずは、文では書けないということを見るために、C#の if文 を見ていきます。
/// C#では以下のようにif文を書きます
int i = 100;
int j = 0;
if (i == 100)
{   // i が 100 の場合の処理
    j = i * i;
}
else
{   // i が 100以外 の場合の処理
    j = i;
}

Consle.WriteLine($"j= { j }");  // output: j= 10,000

// if'文' なので、以下のようには書けない
// 以下はエラーになります
int i = 100;
int j = if (i == 100)           // <- この書き方は無理
        {                       //
            return i * i;       //
        }                       //
        else                    //
        {                       //
            return i;           //
        };                      //

// 上のような処理を書きたい場合は、三項演算子を使うしかない
int i = 100;
int j = i == 100 ? i * i : i

 この例のとおり、C#の if文 では 値の代入をする箇所に if を記述することができません。 では F#の場合はどうなるでしょうか?
// F#では let束縛 するときの右辺に if式 を書けます
let i = 100
let j = if i = 100 then
            i * i 
        else
            i

// 一行で書いてもよい
let j = if i = 100 then i * i else i

 C#でいうところの三項演算子のような使い方ができることがわかります。 しかし、三項演算子ではできない、複数行の複雑な処理を if式 ならば書くことができる点が大きく異なります。

値の書ける場所に式が書けるとは、上記のようなことが可能だということを言っています。 ちなみにプログラミング言語ではお馴染みの for文 や while文 なども、F#では であるため、いろいろな場所に書くことができます。
 興味がある方は簡単に試してみるとよいかもしれません。