1

ツリーが完全であるかどうかをチェックする関数を標準mlで作成したいのですが、関数はどういうわけか機能しますが、間違ったタイプと非網羅的なケースの警告が表示されます

ツリーコード:

datatype 'data tree = 
  EMPTY
| NODE of 'data tree * 'data * 'data tree;

fun isComplete EMPTY = true
  | isComplete (NODE(x, y, z)) = if (x = EMPTY andalso z <> EMPTY) orelse (x <> EMPTY andalso z = EMPTY) then false else true;

上記の関数のタイプは次のとおりです''a tree -> boolが、必要なタイプは次のとおりです。'a tree -> bool

私が持っている警告は次のとおりです。

stdIn:169.8 Warning: calling polyEqual
stdIn:169.26 Warning: calling polyEqual
stdIn:169.45-169.47 Warning: calling polyEqual
stdIn:169.64-169.66 Warning: calling polyEqual
stdIn:124.1-169.94 Warning: match nonexhaustive
          NODE (x,y,z) => ...

私が抱えている問題は何ですか?

編集:

Michaelのおかげで、コードを修正し、機能するようになりました。

- fun isComplete EMPTY = true
    | isComplete (NODE(EMPTY, _, EMPTY)) = true
    | isComplete (NODE(NODE(x, y, z), _, NODE(a, b, c))) = true
    | isComplete (EMPTY, _, NODE(x, y, z)) = false
    | isComplete (NODE(x, y, z), _, EMPTY) = false;
4

2 に答える 2

0

polyEqual警告について:SML / NJでは、この演算子を使用するたびにこの警告が出力されますが、コードに問題があるわけではありません。これについてのブログ投稿があり、コメントの中で誰かが警告が出される理由を説明しています:http: //abstractfactory.blogspot.fr/2006/05/sml-hacking-tip-turn-off-polyequal.html

于 2012-03-29T15:32:20.733 に答える
0

''a tree -> boolタイプは、が等式タイプであることを示します。a等式でのテストをサポートするタイプである必要があります。=<>をテストxして使用しているのでz、ツリーデータは同等性をサポートしている必要があります(値で興味深いことを何もしていない場合でも)。polyEqualこれが警告のルートです。

網羅的ではない一致の警告は、より不可解です。データ型と関数の定義をMoscowMLに貼り付けても、警告は表示されません。タイプを修正して警告も処理することを期待しているので、あまり心配する必要はないと思います。

目的のタイプを取得するには、パターンマッチングを優先し'a tree -> boolて削除することをお勧めします。if例えば:

fun isComplete EMPTY = true
  | isComplete (NODE(EMPTY, _, EMPTY)) = true
  | isComplete (NODE(EMPTY, _, NODE(x,y,z))) = false
  | ... (* fill out the rest of the cases *)

これは宿題のように見えるので、ケースの完全なセットを理解するのはあなたに任せます。

ちなみに、あなたの完全性のテストは正しくないと思います。どちらのサブツリーもそうでない場合に何が起こるかEMPTYを考えてください。内容を考慮せずにツリーを完全と呼びます。ただし、これは表示されている警告とは何の関係もありません。

于 2012-03-29T17:26:53.370 に答える