[解決済み] Haskellでelemを使わずにリストから重複を削除する
2022-02-14 04:10:56
質問
リストから重複を削除する関数を定義しようとしています。今のところ、動作する実装があります。
rmdups :: Eq a => [a] -> [a]
rmdups [] = []
rmdups (x:xs) | x `elem` xs = rmdups xs
| otherwise = x : rmdups xs
しかし、私はこれを
elem
. この場合、どのような方法が最適でしょうか?
でなく、自作の関数を使って行いたいのですが。
nub
または
nubBy
.
解決方法は?
がないと無理だと思います。
elem
(または独自の再実装)。
しかし、あなたの実装には意味上の問題があります。要素が重複しているとき、あなたは 最後 があります。個人的には、最初の重複した項目を残し、残りを削除することを期待します。
*Main> rmdups "abacd"
"bacd"
解決策は、「見た」要素を状態変数として通すことです。
removeDuplicates :: Eq a => [a] -> [a]
removeDuplicates = rdHelper []
where rdHelper seen [] = seen
rdHelper seen (x:xs)
| x `elem` seen = rdHelper seen xs
| otherwise = rdHelper (seen ++ [x]) xs
このように、モラルのある
nub
は標準ライブラリで実装されています(ソースを読む
ここで
). の小さな違いは
nub
の実装は、それが確実に
非厳格
一方
removeDuplicates
はストリクトである(リスト全体を消費して戻る)。
厳密性を気にしないのであれば、原始的な再帰は実はやり過ぎなのです。
removeDuplicates
は、1行で実装できます。
foldl
:
removeDuplicates2 = foldl (\seen x -> if x `elem` seen
then seen
else seen ++ [x]) []
関連
-
[解決済み] Ocaml: list.lengthを使用する。
-
[解決済み] R:リストをテキストファイルに印刷する
-
[解決済み] リストからランダムに項目を選択するにはどうすればよいですか?
-
[解決済み] インデックスを指定してリストから要素を削除する方法
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] リスト内の重複を削除する
-
[解決済み] リストから最初の項目を削除するには?
-
[解決済み] リストの順番を維持したまま、重複を削除するにはどうしたらいいですか?
-
[解決済み] C#でList<T>から重複を削除する
-
[解決済み] 2つのリストを結合して重複を除去し、元のリストの重複を除去しない。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Prologでリストを反転させる
-
[解決済み] Python (2.x) リスト / サブリスト選択 -1 の不具合
-
[解決済み] リストに指定されたメンバが含まれているかどうかを判断するルールを定義する
-
[解決済み] Ocaml: list.lengthを使用する。
-
[解決済み] PrologでListの要素をプリントアウトする
-
error C2955: 'std::list' : クラステンプレートの使用にはテンプレート引数のリストが必要です。
-
QuerySetを配列に変換する:Pythonのlist()関数を直接使用、list()はstr()やint()に類似しています。
-
[解決済み] リスト作成/連結のための構文
-
[解決済み] Prologでリストを追加するにはどうしたらいいですか?
-
[解決済み】2つのリストを連結する - '+=' と extend() の違い)