これ以上の文脈がなければ、あなたの友人が何を意味していたのかを正確に知ることは困難ですが、彼が合理的に意味していた可能性のある 2 つのことが頭に浮かびます。
関数型言語if
では、条件はステートメントではなく式であるため、ステートメントではなく式をif
使用します。この違いは、次のように書くことを意味します。if
let x =
if condition
then value1
else value2
それ以外の:
let x be a mutable variable
if condition
then x = value1
else x = value2
したがって、これにより、変数を変更せずに関数型のスタイルで書くことができます。
if
彼がもう 1 つ言いたかったのは、多くの関数型言語がステートメントの代わりに使用できるパターン マッチングやガードなどの構造を提供しているということです。パターン マッチングを使用すると、値の構造を調べると同時に分解することができます。例として、これを書くことができます:
match my_list with
| x :: xs -> x + sum xs
| [] -> 0
これの代わりに:
if my_list is empty
then
let x be the first element of my_list
let xs be the list containing the remaining elements of my_list
x + sum xs
パターン マッチングの使用は、構造がサポートしていない値に対して関数を呼び出すことを避けるため、推奨されます。上記の例では、リストの最初の要素を返す関数が空のリストに対して呼び出されると、おそらくエラーが発生します (これは、if 条件を台無しにした場合に発生する可能性があります)。しかし、パターン マッチングを使用して最初の要素を取得する場合、これは発生しません。これは、マッチング コンストラクトの構文により、x
and xs
ifのみmy_list
が実際に空ではないことが保証されるためです。
パターン ガードを使用すると、パターン マッチングに任意の条件を追加できます。
match f(x) with
| 0 -> "f(x) was zero"
| 1 -> "f(x) was one"
| x when x > 1 -> "f(x) was greater than one"
| _ -> "f(x) was negative"
if
いずれにせよパターン マッチングを行う場合、これはよりクリーンになりますが、関数型言語で式を使用してはならないということはほとんどありません。値に対してパターン マッチが必要な状況がない場合、ガードを使用できるようにするためだけにパターン マッチを導入することは、if ステートメントを使用するよりもほとんど意味がありません。