2016-07-27 4 views
1

リストからアイテムを削除するための公開された機能はありますか?リストから項目を削除するための公開機能はありますか?

リストからアイテムを削除する操作はありません。

私はこの機能を自分で実装できると確信しています。しかし、私はこの操作がFSharp.Coreでサポートされると予想していました。

何か不足していますか?

+6

私が理解する限り、関数型言語は不変(読み取り専用)のデータを使用します。したがって、要素を削除する代わりに、新しいリストを作成し、望ましくない要素をフィルタリングする必要があります。 –

+2

'List.filter'を否定しますか? –

+0

@ MarkShevchenkoそれは私がパターンマッチングで実装したものです。私はそれがフレームワークに含まれることを期待しています。 –

答えて

5

簡単な答え - 図書館のデザイナーは、それが含まれているとは思わなかった。

すべての種類のライブラリを設計しますが、特にF#のコレクションモジュールのようなコアライブラリは、複雑さと有用性との間の適切なバランスを常に探しています。大規模なライブラリを使用するコストを相殺するために、新機能がテーブルに十分に備わっているかどうかを慎重に検討する必要があります。

アイテムのインスタンスをすべて削除するには、List.filterに否定の述語を使用できます。設計者は、内部で否定を行うList.remove関数を含めることができます。実際にはリスプはfilterremoveの両方を持つ傾向があります。 HaskellとOCamlでは、あなたはfilterしか持っていません。

アイテムのインスタンスを1つだけ削除する場合は、自分で書き込む必要があります。これは、リストのためのやや非標準のユースケースです。リストは要素を順番に累積しています。リストの途中から特定の要素を削除することは(頭を削除することや、望ましくない要素をすべて削除することとは対照的に)ほとんど役に立ちません。順序を保持する必要なしに要素を追加または削除することに重点を置いている場合は、セットまたはマップ(マルチセットとして使用)がジョブに適しています。

6

あなたは、あなたがこれを行うことができ、その値に基づいて削除いくつかのアイテムに新しいリストを作成する意味場合:

[1; 2; 3; 1] |> List.filter ((<>) 1) 

// Returns [2; 3] 

これは括弧でラップすることにより、プレフィックスモードで<>(等しくない)演算子を使用しています最初の引数を指定するだけでカリングします。

この値のすべてのインスタンスは除外されています。

1

私はあなたがこれを期待する理由がわかりません。たとえば、C#の配列では同じ機能(AFAIK)は使用できません。

しかし、あなたは、一般的なリストを使用することができますしたい場合:ジェネリックリストは.Remove.RemoveAt.RemoveAllメソッドを持ってい

open System.Collections.Generic 

let xs = [1..3] 
let xs' = List(xs) 
xs'.Remove(2) 
xs' 
//val it : List<int> = seq [1; 3] 

を。

関連する問題