質問

Haskellのリスト差分演算子と同等の演算子はありますか \\ F#で?

役に立ちましたか?

解決

はねられましたが、ここに実装を書く価値があると思います。 ( /-/ ) (Haskell の F# バージョン \\):

let flip f x y = f y x

let rec delete x = function
  | [] -> []
  | h :: t when x = h -> t
  | h :: t -> h :: delete x t

let inline ( /-/ ) xs ys = List.fold (flip delete) xs ys

これはHaskellのものとして動作します \\, 、 となることによって (xs @ ys) /-/ xs = ys. 。例えば: (7 :: [1 .. 5] @ [5 .. 11]) /-/ [4 .. 7] と評価されます [1; 2; 3; 5; 7; 8; 9; 10; 11].

他のヒント

いいえ...特殊文字のセットを使用して、それを記述し、中置演算子にするだけです。バックスラッシュ (\) は以下のリストにないため、中置演算子としては機能しません。を参照してください。 マニュアル:

中置演算 :=

or || & && <OP >OP $OP = |OP &OP ^OP :: -OP +OP *OP /OP %OP

**OP

接頭辞-op :=

!OP ?OP ~OP -OP +OP % %% & &&

減数のセットから項目をフィルタリングします。

let ( /-/ ) xs ys =
    let ySet = set ys
    let notInYSet x = not <| Set.contains x ySet
    List.filter notInYSet xs

私はこれを使用しています:

let (/-/) l1 l2 = List.filter (fun i -> not <| List.exists ((=) i) l2) l1

誰かが問題を見つけたら、私に知らせてください。

リスト用であるため、結果に重複が含まれる可能性があります。例えば:

[1;1;2] /-/ [2;3] would be eq to [1;1]

Haskell が明らかに提供している、順序付けされているがソートされていない奇妙なマルチセット減算ではなく、従来のセットの差分が本当に必要な場合は、組み込み関数を使用してリストをセットに変換するだけです。 set 関数を使用してから組み込みを使用します - 集合の差を計算する演算子:

set xs - set ys

例えば:

> set [1..5] - set [2..4];;
val it : Set<int> = seq [1; 5]
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top