F#中的Haskell列表差异运算符

F#中的Haskell列表差异运算符

Haskell list difference operator in F#

F#中是否有与Haskell的列表差异运算符\\\\等效的运算符?


被弹跳,但我认为值得在这里编写( /-/ )(Haskell的\\\\的F#版本)的实现:

1
2
3
4
5
6
7
8
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]


不,...只需使用特殊字符集将其编写并使其成为中缀运算符即可。反斜杠(\\)不在下面的列表中,因此它将不能用作中缀运算符。请参见手册:

infix-op :=

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

**OP

prefix-op :=

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

从子交易集合中筛选项目:

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

我正在使用此:

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

如果有人发现问题,请告诉我。

用于列表,因此结果中可能有重复项。例如:

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

假设您确实想要常规集差异,而不是Haskell显然提供的怪异的有序但未排序的多集减法,只需使用内置的set函数将列表转换为集,然后使用内置的运算符以计算设置差异:

1
set xs - set ys

例如:

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

推荐阅读