3

標準 ML では、if-then-else を単一の式として使用し、else 句なしで if-then のみを許可しない理由は何ですか?

else節なしでSMLで条件文を書くことは可能ですか?

4

4 に答える 4

10

標準 MLプログラムはステートメントではなくです。

標準 ML は、いくつかの不純な機能を備えた関数型プログラミング言語です。標準 ML で書かれたプログラムは、[C に似た言語で見られる] ステートメントやコマンドではなく、評価される式で構成されています。

そのため、if-then-elseであるため、値に評価される必要があります。が必要でない場合else、条件が失敗した場合、式は事実上「値を持たない」ことになりますが、式の定義により、値が必要です。明示的に要求するelseと、どちらの場合でも式が値に評価されることが保証されます1

さらに、thenandelse式の型は統一する必要があります。これが構造全体の型になりますif-then-else

つまりif-then-else、SMLでは?:、C に似た言語の 3 項 ( ) 演算子に似ており、この「制限」も共有しています。これは等価ではありませんif-分岐が副次的影響についてのみ評価されるステートメントです。


1すべての関数型言語が明示的なthen式を必要とするわけではなく、一部の言語はデフォルトで特定の値になります。ただし、これは SML での動作方法であり、特定の型に「デフォルト値」が存在する必要はなく、結果の型を統一する必要があるため、理にかなっています。

于 2013-11-08T00:14:33.150 に答える
4

これは標準 ML に固有のものではありません。if-then-else 式を使用する多くまたはほとんどの言語では、else 式が必要です。たとえば、C に似た言語 (C、C++、C#、Java、D、Perl、JavaScript、PHP など) では、式は;の形式を取ります。Visual Basic では、この関数には、真の場合の式と偽の場合の式の両方が必要です。等々。(Excel 式言語など、両方の値を必要とせず、else 式の代わりに既定値を使用する言語もありますが、SML は例外ではありません。)cond ? expr_if_true : expr_if_falseIif

else節なしでSMLで条件文を書くことは可能ですか?

SML には「条件文」どころか「文」の概念がありません。宣言がありますが、条件付きでのみ何かを宣言するのは意味がありません (型情報はすべてコンパイル時に決定されますが、条件はもちろん実行時まで評価できないため)。

条件が true のときに特定のアクションを実行し、条件が false のときにアクションを実行しない場合は、then 式だけが副作用を持つ条件式を使用する必要があります。例えば:

val _ = if i > 30 then print "i is too big!" else ()

(ここでprint "Yay!"、 と()は両方とも type の式ですunit)。

于 2013-11-08T00:27:39.920 に答える
0

ifそうでなければ、分岐が一致しない場合、式の値はどうなるでしょうか? ブランチを必要としないためにelseは、デフォルト値を推測できる必要があります。理にかなっている唯一のことは、例外を発生させることです。SML の設計のオプションであった可能性がありますが、これはあまり関連性がありませんでした。

に有効な式の値がないと感じたときはいつでもelse、次のように言ってください。

val x = 
   if condition then expression 
   else raise Domain;
于 2014-02-04T19:25:39.290 に答える
0

あなたの言っていることは理解できますが、関数の "if" ステートメントが false を返す場合、プログラムは何をすべきかわかりません。おそらく、式が false の場合に関数を続行したいだけです....そうですか?

それを実現したい場合は、「else」に、関数の残りの部分に渡すだけのことをさせる必要があります。

私は実際にSMLについてあまり知らないので、その方法を教えてもらえませんでした

于 2013-11-08T00:13:56.860 に答える