Вопрос

Существует ли эквивалентный оператор для оператора разности списков Haskell \\ в F#?

Это было полезно?

Решение

Был отклонен, но я считаю, что стоит написать здесь реализацию ( /-/ ) (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

Это будет работать как у Хаскелла \\, так что (xs @ ys) /-/ xs = ys.Например: (7 :: [1 .. 5] @ [5 .. 11]) /-/ [4 .. 7] оценивает в [1; 2; 3; 5; 7; 8; 9; 10; 11].

Другие советы

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

инфиксный-op :=

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

**OP

префикс-op :=

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

Фильтровать элементы из набора подзаголовка:

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]

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

set xs - set ys

Например:

> set [1..5] - set [2..4];;
val it : Set<int> = seq [1; 5]
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top