F#의 Haskell 목록 차이 연산자
-
09-06-2019 - |
문제
Haskell의 목록 차이 연산자와 동등한 연산자가 있습니까? \\
F#에서?
해결책
반송되었지만 여기에 구현을 작성할 가치가 있다고 생각합니다. ( /-/ )
(하스켈의 F# 버전 \\
):
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]
.
다른 팁
아니요...그냥 작성하고 특수 문자 세트를 사용하여 중위 연산자로 만드세요.백슬래시(\
)은 아래 목록에 없으므로 중위 연산자로 작동하지 않습니다.참조 수동:
중위 작업 :=
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]
제휴하지 않습니다 StackOverflow