2008-09-12 4 views

ответ

4

Был подпрыгнул, но я считаю, что это стоит написать здесь реализацию (/-/) (версия F # Haskell's \\):

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

Nope ... Просто напишите это и сделайте его инфиксным оператором - используя набор специальных символов. Обратная косая черта (\) отсутствует в списке ниже, поэтому она не будет работать как инфиксный оператор. Смотрите manual:

инфиксную-оп: =

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

**OP 

префикс-оп: =

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

«// будет работать как инфиксный оператор». Нет, не будет. Это однострочный комментарий в F #. – 2011-02-12 15:05:09

-3

Предполагая, что вы действительно хотите, обычный набор разницы, а не странно заказал, но -несортированное многозадачное вычитание, которое, по-видимому, предоставляет Haskell, просто преобразует списки в наборы с использованием встроенной функции set, а затем использует встроенный - оператора вычислить разность множеств:

set xs - set ys 

Например:

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

Это неправильно обрабатывает дубликаты. – 2009-06-18 07:20:32

1

элементов фильтра из набора вычитаемые:

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] 
Смежные вопросы