0

SML の学習を始めたばかりで、コードに問題があります。int を List of ints と比較して、int より小さい数値のリストを返したい

 fun less(e, L): L =
  if L = [] then []
  else (hd[L] < e :: less tl(hd))

リスト L と比較して、e 未満のすべての数値のリストを返したいのですが、何が間違っていますか?

4

2 に答える 2

4
hd[L] < e :: less tl(hd)

まず単にorless tl(hd)と同じです。書くということは、「x に g を適用し、結果に f を適用する」という意味ではありません。そのためには、書く必要があります。一般に、アトミック式を括弧で囲んでも何も変わりません。開き括弧の前にスペースを入れると、構文がそうではないもののように見えるため、それを避ける必要があります。less tl hd(less tl) hdf g(x)f (g x)

次に、関数であり、リストを期待するtl hdので、あまり意味がありません。あなたはおそらくではなく に応募するつもりでした。hdtltlLhd

次にhd [L]、リストの最初の要素を取ります[L][L]単一の要素を持つリストです: L. したがってhd [L]、書くことは単に書くことと同じですL。あなたはおそらく の頭を取るつもりだっLた. hd Lそのためには、括弧なしで書くだけです。

(hd L) < eここでの問題は、ブール値であるの結果をリストに追加しようとしていることです。これは機能しますが (コンパイルしてエラーなしで実行する場合と同様)、ブール値のリストが生成されます ( truee より小さい要素の afalseとその他の要素の a が含まれます)。それはあなたが欲しいと言ったものではありません。必要なものを取得するifには、ヘッドが小さい場合はリストに追加し、そうでない場合はe何も前に追加しない が必要です。

これらの問題を修正すると、コードが意図したとおりに機能するはずです。

PS: 通常、パターン マッチングを使用してリストが空かどうかを調べ、空でないリストを先頭と末尾に分割することをお勧めします。関数hdtlは、ほとんどの状況で避けるのが最善です= []。ただし、パターン マッチングについてまだ説明していない場合は、今のところこれで問題ありません。

PPS: 関数を使用することで、やりたいことをより簡単に再帰なしで行うことができますfilter。しかし、繰り返しますが、まだカバーしていない場合は、今のところ問題ありません。

于 2012-10-19T18:29:50.587 に答える
1

要素を比較しなかったのは間違っていますか。あなたは空のリストを用意しただけです。何かのようなもの

e < hd L の場合、e::less(e, (tl L))

于 2013-01-20T21:39:39.523 に答える