3

これを説明するのは簡単ではありませんが、試してみます。私は私の方法をいくつかのCと混同していると思いますが、ここに行きます:

次のように、リストが完全かどうかを確認したい:

main> check 1 [1,3,4,5]
False

main> check 1 [1,2,3,4]
True

これは有限リストであり、リストを順序付ける必要はありません。しかし、リスト内には、True にならない数がほとんどです。最初のケースでは、番号 2 です。

これは私のバージョンですが、コンパイルさえしません。

check :: Eq a => a -> [a] -> Bool
check n [] = False
check n x | n/=(maximum x) = elem n x && check (n+1) x
          | otherwise = False
4

3 に答える 3

4

したがって、これを正しく理解している場合は、リスト内のすべての要素が、並べ替え時にギャップのないシーケンスを形成していることを確認する必要があります。これが1つの方法です:

noGaps :: (Enum a, Ord a) => [a] -> Bool
noGaps xs = all (`elem` xs) [minimum xs .. maximum xs]

[minimum xs .. maximum xs]最小値から最大値までのすべての値の順次リストを作成します。all elem次に、それらが元のリストのentであることを確認します。

于 2012-12-20T18:49:30.423 に答える
3

型制約が宣言したものよりも大きいため、関数はコンパイルされません。a-のインスタンスである必要があるだけだと言いますEqが、それに何かを追加すると、 のインスタンスである必要がありますNum。関数の使用方法も、宣言した署名では意味がありません。例でcheck [1,2,3,4]は aBoolですが、指定したコードではEq a => [[a]] -> Bool(最初にコンパイルした場合) になります。

整数を扱うためにこれだけが必要ですか? そうでない場合は、その場合の「完全」が何を意味するかについて例を挙げてください。はいの場合、それらは常に 1 から始まりますか?

于 2012-12-20T18:49:54.230 に答える
0

これは、ソートされたリストで機能する関数を使用し、ソートされた入力でそれを使用する、問題に対する別の見方です。

n以下は、指定されたIntのリストに から までのすべての値が含まれていることを確認し1ますn

  check :: (Num a, Ord a) => [a] -> Bool

  import List

  check l = check_ 1 (sort l)
     where check_ n [] = True
                 check_ n [x] = n == x
                 check_ n (x:y:xs) = (x+1)==y && check_ (n+1) (y:xs)

List.sortで実装された実際のチェックのリストを準備するために を使用していることに注意してくださいcheck_

于 2012-12-20T19:20:37.700 に答える