0

SML/NJコンパイラで非網羅的な一致警告をどのように処理するのだろうか。たとえば、データ型を定義できます

datatype DT = FOO of int | BAR of string

そして、FOOだけを取ると私が知っている機能を持っています

fun baz (FOO n) = n + 1

コンパイラは警告を出します

stdIn:1.5-1.24警告:完全に一致しない
          FOO n=>..。
val baz = fn:DT-> int

意図的に行った不完全な一致の警告は表示したくありません。出力をスキャンして、実際にはバグである可能性のある警告を見つける必要があるためです。このような関数を書くことができます

fun baz (FOO n) = n + 1 
  | baz _ = raise Fail "baz"

しかし、これはコードを乱雑にします。この状況で人々は通常何をしますか?

4

5 に答える 5

3

次のコンパイラ フラグを設定して、非網羅的な一致警告の警告レベルを構成できます。

  • Compiler.Control.MC.matchNonExhaustiveWarn
  • Compiler.Control.MC.matchNonExhaustiveError

これらの両方が false に設定されている場合、警告は生成されません。残念ながら、これにより、このエラーのすべてのインスタンスの警告がオフになります。これは、このセーフガードが削除されるため、おそらく望ましくありません。

(注: コードでこれらを false に設定するだけです)

詳細については、こちらをご覧ください。項目 46 では、警告について具体的に説明しています。

于 2010-04-04T16:07:33.803 に答える
3

ダニエルが述べたように、警告をオフにすることはできますが、それはお勧めしません。

関数が許容される値の範囲全体で動作できるように、データ型を調整できることが最善です。2 番目に良いのは、コードをエラーで "ごちゃごちゃ" して、何が起こっているかを明確にすることです (そして、より意味のある実行時エラーを許可します)。

于 2010-04-04T16:17:36.993 に答える
2

関数がドメイン全体をどのように処理するかを決定するためにすべてのケースをカバーするか、警告を表示する必要があります。最後の代替方法は、最初に関数を介してフィードする値を修正して、呼び出し元で分解が行われるようにすることです。

于 2010-04-04T15:32:28.503 に答える
1

これを頻繁に行う場合は、データ型を少し再考する必要があると思います。Foo と Baz が同じ種類のオブジェクトでないのに、なぜ 1 つのデータ型にグループ化するのですか? それらが同じオブジェクトを構築する異なる方法である場合、Foo で機能する関数は Baz でも適切な処理を実行できると期待できます。コンストラクター Car と Bike を持つ Vehicle 型があり、Car に対してのみ操作を実行したい場合、コードが大きい場合は、Car の定義を分離し、使用しているすべての場所を変更するのが正しい方法です。 Vehicles ですが、Car のみが Car を直接使用することを想定しています。

于 2010-04-20T10:23:41.650 に答える
1

他の回答が言うように、データ型を変更して完全な一致を生成する方がクリーンです。この場合、DT型を変更するか、戻り値の型を から変更できますbaz。例えば:

datatype DT = FOO of int | BAR of string
fun baz (FOO n) = SOME (n + 1)
  | baz _       = NONE

その後baz、タイプがval baz = fn : DT -> int optionあり、によって発生したエラーの処理について心配する必要はありませんbaz

于 2010-05-16T18:10:19.560 に答える