F# の Haskell リスト差分演算子
-
09-06-2019 - |
質問
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]
所属していません StackOverflow