목록과 배열이 동일한 지 확인 F #

Jan 20 2021

목록과 배열을 비교하여 동일한 지 확인하려고합니다. 리스트 list = [1;2;3;4]와 배열 이 있다고 가정 해 봅시다 ar = [|1;2;3;4|]. 함수는 true같고 같지 않으면 반환해야합니다 false. 나는 이렇게했다 :

let list = [1;2;3;4]
let ar = [|1;2;3;4|]

let list' = Array.toList ar
(list = list')

그래서 기본적으로 제가하고있는 것은 단순히 두 개의 목록을 변환하고 비교하는 것입니다. 제 질문은 이것을 수행하는 다른 방법이 있다는 것입니다. 즉, 목록과 배열 사이를 단순히 변환하지 않고 라이브러리 함수에 전적으로 의존하지 않는 것을 의미합니다.

답변

4 TomasPetricek Jan 20 2021 at 19:09

목록과 배열 (및 대부분의 다른 컬렉션)이 seq<'a>인터페이스를 구현한다는 사실을 사용할 수 있으므로 ( IEnumerable<T>.NET 용어로) Seq변환없이 모듈 에서 함수로 전달할 수 있습니다 . 이것은 단지 인터페이스를 사용하기 때문에 오버 헤드가 없습니다.

두 시퀀스가 ​​동일한 지 확인하기 위해 생각할 수있는 가장 쉬운 함수 forall2는 두 시퀀스를 가져와 조건자가 요소를 쌍으로 유지하는지 확인하는입니다. 이 경우 술어는 (fun a b -> a = b)다음과 같이 축약 할 수있는 동등성 테스트 입니다 (=).

let list = [1;2;3;4]
let ar = [|1;2;3;4|]

Seq.forall2 (=) list ar
2 brianberns Jan 20 2021 at 10:37

이것을 할 수있는 방법은 많이 있습니다. 다음은 요소를 쌍으로 비교하는 것입니다.

if list.Length = ar.Length then
    Seq.zip list ar
        |> Seq.forall (fun (a, b) -> a = b)
else false
2 SerejaBogolubov Jan 20 2021 at 15:01

F # 문서 는 다음과 같이 말합니다.

Seq.compareWith 함수를 사용하여 두 시퀀스를 비교합니다. 이 함수는 연속 된 요소를 차례로 비교하고 첫 번째 같지 않은 쌍을 만나면 중지합니다. 추가 요소는 비교에 기여하지 않습니다.

귀하의 경우에는 oneliner가됩니다.

0 = Seq.compareWith (Comparer<_>.Default) list ar

컴파일 여부를 확인하지 않았습니다. Comparer.Default 를 사용하여 기본 형식을 비교합니다. 그렇지 않으면 복잡한 사용자 지정 형식의 경우 고유 한 형식을 제공해야 할 수 있습니다.

2 sardok Jan 20 2021 at 19:12

Linq와 함께;

Enumerable.SequenceEqual (list, ar)
2 ThanasisK Jan 20 2021 at 19:24

이것을 바탕으로

let l = [1;2;3;4]
let a = [|1;2;3;4|]
let result = Seq.compareWith Operators.compare l a