Operador de diferença de lista Haskell em F #
-
09-06-2019 - |
Pergunta
Existe um operador equivalente ao operador de diferença de lista de Haskell \\
em F#?
Solução
Foi rejeitado, mas acredito que vale a pena escrever aqui a implementação do ( /-/ )
(a versão F# do Haskell \\
):
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
Isso funcionará como Haskell \\
, para que (xs @ ys) /-/ xs = ys
.Por exemplo: (7 :: [1 .. 5] @ [5 .. 11]) /-/ [4 .. 7]
avalia em [1; 2; 3; 5; 7; 8; 9; 10; 11]
.
Outras dicas
Não...Basta escrevê-lo e torná-lo um operador infixo – usando o conjunto de caracteres especiais.Barra invertida (\
) não está na lista abaixo, portanto não funcionará como um operador infixo.Veja o manual:
infix-op :=
or || & && <OP >OP $OP = |OP &OP ^OP :: -OP +OP *OP /OP %OP **OP
prefixo-op :=
!OP ?OP ~OP -OP +OP % %% & &&
Filtre os itens do conjunto do subtraendo:
let ( /-/ ) xs ys =
let ySet = set ys
let notInYSet x = not <| Set.contains x ySet
List.filter notInYSet xs
Estou usando isso:
let (/-/) l1 l2 = List.filter (fun i -> not <| List.exists ((=) i) l2) l1
Se alguém encontrar algum problema, me avise.
É para listas, portanto pode haver duplicatas no resultado.Por exemplo:
[1;1;2] /-/ [2;3] would be eq to [1;1]
Supondo que você realmente queira a diferença de conjuntos convencional em vez da estranha subtração multiconjunto ordenada, mas não classificada, que Haskell aparentemente fornece, basta converter as listas em conjuntos usando o recurso integrado set
função e, em seguida, use o built-in -
operador para calcular a diferença definida:
set xs - set ys
Por exemplo:
> set [1..5] - set [2..4];;
val it : Set<int> = seq [1; 5]