Оператор разности списков Haskell в F#
-
09-06-2019 - |
Вопрос
Существует ли эквивалентный оператор для оператора разности списков 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]