Pergunta

Existe um operador equivalente ao operador de diferença de lista de Haskell \\ em F#?

Foi útil?

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]
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top