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

时间:2008-09-12 18:31:39

标签: haskell f# functional-programming operators

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

5 个答案:

答案 0 :(得分:4)

没有......只需编写它并使其成为中缀操作符 - 使用一组特殊字符。反斜杠(\)不在下面的列表中,因此它不能用作中缀运算符。请参阅manual

  

infix-op:=

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

**OP
     

前缀-op:=

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

答案 1 :(得分: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]

答案 2 :(得分:1)

从减数集中过滤项目:

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

答案 3 :(得分: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]

答案 4 :(得分:-3)

假设你真的想要传统的集合差异而不是Haskell显然提供的奇怪的有序但未排序的多集减法,只需使用内置的set函数将列表转换为集合,然后使用内置的-运算符用于计算集合差异:

set xs - set ys

例如:

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