SML の学習を始めたばかりで、コードに問題があります。int を List of ints と比較して、int より小さい数値のリストを返したい
fun less(e, L): L =
if L = [] then []
else (hd[L] < e :: less tl(hd))
リスト L と比較して、e 未満のすべての数値のリストを返したいのですが、何が間違っていますか?
hd[L] < e :: less tl(hd)
まず単にorless tl(hd)
と同じです。書くということは、「x に g を適用し、結果に f を適用する」という意味ではありません。そのためには、書く必要があります。一般に、アトミック式を括弧で囲んでも何も変わりません。開き括弧の前にスペースを入れると、構文がそうではないもののように見えるため、それを避ける必要があります。less tl hd
(less tl) hd
f g(x)
f (g x)
次に、関数であり、リストを期待するtl hd
ので、あまり意味がありません。あなたはおそらくではなく に応募するつもりでした。hd
tl
tl
L
hd
次にhd [L]
、リストの最初の要素を取ります[L]
。[L]
単一の要素を持つリストです: L
. したがってhd [L]
、書くことは単に書くことと同じですL
。あなたはおそらく の頭を取るつもりだっL
た. hd L
そのためには、括弧なしで書くだけです。
(hd L) < e
ここでの問題は、ブール値であるの結果をリストに追加しようとしていることです。これは機能しますが (コンパイルしてエラーなしで実行する場合と同様)、ブール値のリストが生成されます ( true
e より小さい要素の afalse
とその他の要素の a が含まれます)。それはあなたが欲しいと言ったものではありません。必要なものを取得するif
には、ヘッドが小さい場合はリストに追加し、そうでない場合はe
何も前に追加しない が必要です。
これらの問題を修正すると、コードが意図したとおりに機能するはずです。
PS: 通常、パターン マッチングを使用してリストが空かどうかを調べ、空でないリストを先頭と末尾に分割することをお勧めします。関数hd
とtl
は、ほとんどの状況で避けるのが最善です= []
。ただし、パターン マッチングについてまだ説明していない場合は、今のところこれで問題ありません。
PPS: 関数を使用することで、やりたいことをより簡単に再帰なしで行うことができますfilter
。しかし、繰り返しますが、まだカバーしていない場合は、今のところ問題ありません。
要素を比較しなかったのは間違っていますか。あなたは空のリストを用意しただけです。何かのようなもの
e < hd L の場合、e::less(e, (tl L))