4

関数型プログラミングの支持者である友人とプログラミングについて話し合っていました。彼は、if ステートメントを使用する必要はないと述べましたが、どのように実装するかを概念化できないようです。

if (something):
    do this;

else:
    do something_else;

機能的パラダイムでは?

編集: 私の友人は、if 式を使用する必要がない場合があることを具体的に述べまし。例えば:

if x is odd:
    x + 1
else:
    x / 2

if ステートメントや条件を使用せずに上記を実装する方法はありますか?

4

2 に答える 2

6

これ以上の文脈がなければ、あなたの友人が何を意味していたのかを正確に知ることは困難ですが、彼が合理的に意味していた可能性のある 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 条件を台無しにした場合に発生する可能性があります)。しかし、パターン マッチングを使用して最初の要素を取得する場合、これは発生しません。これは、マッチング コンストラクトの構文により、xand xsifのみ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 ステートメントを使用するよりもほとんど意味がありません。

于 2013-09-16T21:03:06.450 に答える
2

混乱するはずの部分は ではなくif、" do" です。

関数型プログラミングでは、何も「実行」しません。結果を入力の関数として 定義
するだけです。

もちろん、関数には条件が含まれる場合があります ( cond ? a : bC#、Java、C++ などの言語のように) が、aおよびbは一般的な型に評価される式です。それらはステートメントではないため、結果はに応じてaまたは のいずれかになります。bcond

于 2013-09-16T21:03:15.997 に答える