2017-04-23 1 views
1

私は最後にMLを実装しようとしています。 lastはリストの最後の要素を返すことができます。MLを使用して最後に実装する

たとえば、L = [1,2,3,4]、last(L)= 4です。これは私の実装です。

fun last [] = last((h::nil)) = h | last((h::tail)) = last(tail); 

これは私に "unbound variable or constructor:h"を与えます。私の理解では、hは私が宣言した変数で、リストの先頭を表しています。なぜ変数hにエラーが発生するのでしょうか?

+0

として書き込む使用することができます誤った行動の有用仕様ではありませんあなたを助けること。 *何がうまくいかなかったの? *どのように動作しませんでしたか?エラーメッセージが表示されましたか?はいの場合、* exact *エラーメッセージは何ですか?警告メッセージを受け取りましたか?はいの場合、* exact *警告メッセージは何ですか?期待した結果が得られませんでしたか?はいの場合、どの結果が得られましたか、どの結果が期待されましたか、その結果を期待したのはなぜですか?また、実際の結果とどのように期待された結果が異なっていますか?あなたは期待された行動を観察していませんでしたか?はいの場合は、どのような動作を観察しましたか?どの動作をしましたか... –

+0

...期待どおりにその動作を期待していたのですが、実際の動作と期待された動作がどのように違うのですか?可能性のある例外、コーナーケース、特殊ケース、エッジケースなど、予想される動作や結果を正確に指定してください。入力の例と希望する出力と動作を提供し、通常のケースだけでなく、例外、コーナーケース、特殊ケース、エッジケースの両方を示してください。何が問題をデバッグしようとしましたか?どのようにそれを分離しようとしましたか?問題を絞り込むためにどのようなステップを実行しましたか? –

答えて

4

あなたの定義は

fun last [] = last((h::nil)) = h 
| last((h::tail)) = last(tail); 

SMLはlast []に比較last((h::nil)) = hの結果であるブール値を代入しようとする試みとして、最初の句を解釈するようにレイアウトすることができます。その句で一致するパターンが[][]であるため、hが含まれていないため、比較last((h::nil)) = hhはバインドされていないため、エラーです。いずれにせよ、そのような比較はほとんど意味がなく、明らかにあなたの意図ではありません。

last []は分かりやすく定義できません。代わりに、単純に無視するか、エラー(Emptyまたはカスタムエラー)を発生させて対処するかのどちらかです。関数lastの実際の基本節は、1要素のリストです。あなたはそれをどう扱うか知っているようだ。あなたのコードは、実際にあなたが同時にlast []last (h::nil)の両方に値を与え、だけではなく、後者を行うには、あなたの最初の句を使用しようと停止したときに動作します:

fun last (h::nil) = h 
| last (h::tail) = last tail; 
ここ

私は、h::tailh::nil周りに余計な括弧の3つのペアを削除しましたおよびtail。 SML関数呼び出しでは、かっこは必要ありません。適切なグループ化を保証する必要がある場合にのみ、カッコが必要です。第1のパターンは、[h]としてさらに冗長的に書くこともできることに留意されたい。

あなたはlast []の定義を与えていないので、非燃費の警告メッセージが表示されます。 「私は動作しませんでした」(それが唯一の空でないリストに定義された関数とかなり共通であるため)あなただけの警告を無視することができ、またはそれは

fun last [] = raise Empty 
| last (h::nil) = h 
| last (h::tail) = last tail; 
関連する問題