2012-03-29 3 views
1

ツリーが完全かどうかをチェックする関数を標準mlで作成したいが、関数がどうにか動作するが、間違った型と警告が出るツリーが完全であるかどうかを確認する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) => ... 

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

EDIT:マイケルへ

おかげで、私は、コードを固定し、今では動作します:polyEqual警告に関する

- 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; 
+0

EDITコードはまだ正しくありません。再帰的ではありません。左右のノードは完全ではない可能性があります。 – Milwaukoholic

答えて

0

''a tree -> boolタイプはaが平等タイプであることを示している:それはequalsとテストをサポートタイプでなければなりません。 xzをテストするのに=<>を使用しているので、ツリーデータは等価性をサポートしている必要があります。これは警告のpolyEqualのルートです。

非完全一致警告は、より困惑しています。あなたのデータ型と関数の定義をモスクワのMLに貼り付けると、ではなく、が警告を受け取ります。私はそれをあまり心配するつもりはないと思うので、私はタイプを修正して警告を処理することも期待しています。

'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でないときに何が起こるかを考えてください。内容を考慮せずにツリーを完成させるといいでしょう。しかし、これはあなたが見ている警告とは関係ありません。

+0

私はSML/NJを使っています。 とにかく、アドバイスをいただき、ありがとうございます。 ありがとうございました –

+0

@ aizen92 SML/NJがインストールされていないので、残念ながらそこでテストできません。 'if'と' andalso'と 'orelse'がパターンマッチングの特別なケースであると考えると、SML/NJとMosMLは' if'式を異なる構造のパターンマッチに変換するだけですそのうちの網羅的なものです。基本的な結論:好きなパターンマッチング! –

0

:SML/NJでこの警告は、あなたがこの演算子を使用するたびに印刷されていますが、それはあなたのコードが間違っていることを意味しません。ここではそれについてのブログ記事だ、と警告が与えられている理由をコメントで誰かが説明していますhttp://abstractfactory.blogspot.fr/2006/05/sml-hacking-tip-turn-off-polyequal.html

+0

大丈夫ですが、徹底的には網羅的ではありませんが、何が欠けていますか? –

+0

私は実際に知りません、そして、今は手元に通訳がありません... – Alex

関連する問題