代码之家  ›  专栏  ›  技术社区  ›  fryguybob

F中的Haskell列表差分算子#

  •  8
  • fryguybob  · 技术社区  · 17 年前

    是否有一个等价于Haskell列表差分运算符的运算符 \\ 在F#中?

    5 回复  |  直到 13 年前
        1
  •  5
  •   Be Brave Be Like Ukraine    13 年前

    不。。。只需编写它并使其成为一个中缀运算符——使用特殊字符集。反斜杠( \ )不在下面的列表中,因此它不能作为中缀运算符使用。见 manual :

    中缀运算:=

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

    前缀op:=

    !OP ?OP ~OP -OP +OP % %% & &&
    
        2
  •  5
  •   Ramon Snir    13 年前

    被反弹了,但我相信值得在这里写下的实现 ( /-/ ) (哈斯克尔的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]

        3
  •  2
  •   Hans    15 年前

    let ( /-/ ) xs ys =
        let ySet = set ys
        let notInYSet x = not <| Set.contains x ySet
        List.filter notInYSet xs
    
        4
  •  1
  •   Lay González    11 年前

    我用这个:

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

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

    [1;1;2] /-/ [2;3] would be eq to [1;1]
    
        5
  •  -2
  •   J D    15 年前

    假设您真的想要传统的集合差分,而不是Haskell提供的奇怪的有序但未排序的多集减法,只需使用内置的 set - 运算符计算集合差:

    set xs - set ys
    

    例如:

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