2008-09-12 25 views

答えて

4

はバウンス、まだ私はそれが価値があると信じていました(/-/)(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]と評価されます。

4

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

中置-OP:=

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

**OP 

プレフィックス-OP:=

あなたが本当に従来の差集合をしたいのではなく奇妙が注文した - しかし仮定し
!OP ?OP ~OP -OP +OP % %% & && 
+4

"//中置演算子として機能します。"いいえ、それはしません。これはF#の1行のコメントです。 –

-3

Haskellが提供していると思われるマルチセットの減算は、組み込みのset関数を使用してリストをセットに変換し、組み込みの0123減数のセットから

> set [1..5] - set [2..4];; 
val it : Set<int> = seq [1; 5] 
+3

これは重複を正しく処理しません。 –

+0

編集でも重複が正しく処理されません。 \\演算子は、差異を設定する動作を提供しません。バッグ差異の動作を提供します。 – ScottWest

+0

@Scott:ありがとう。おそらく忠実な翻訳をする価値がないように見えます。誰もがその機能性を望んでいるとは思っていません。 –

1

フィルター項目:たとえば

set xs - set ys 

:差集合を計算するオペレータは

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

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

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

誰もが問題を見た場合、私に知らせてください。

リストのため、結果に重複が存在する可能性があります。たとえば、

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