在F#中是否有类似于Haskell的列表差分操作符
\\
的等效操作符?\\
的等效操作符?不是这样的...只需编写并将其设置为中缀运算符-使用特殊字符集。反斜杠(\
)不在以下列表中,因此它不能用作中缀运算符。请参见手册:
infix-op :=
or || & && <OP >OP $OP = |OP &OP ^OP :: -OP +OP *OP /OP %OP **OP
prefix-op :=
!OP ?OP ~OP -OP +OP % %% & &&
我之前被弹出了,但我认为在这里写出(/-/)
的实现是值得的(这是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
\\
一样工作,因此(xs @ ys) /-/ xs = ys
。例如:(7 :: [1 .. 5] @ [5 .. 11]) /-/ [4 .. 7]
计算结果为[1; 2; 3; 5; 7; 8; 9; 10; 11]
。从减数集合中筛选项目:
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]
set
函数将列表转换为集合,然后使用内置的-
运算符计算集合差异:set xs - set ys
例如:
> set [1..5] - set [2..4];;
val it : Set<int> = seq [1; 5]