2016-11-19 4 views
3

나는 두 Traversable의 자신의 순서를 구별하지 않고 같은 요소를 포함하는지 확인하고 싶습니다.Traversable과 정확히 같은 요소를 비교하는 방법은 무엇입니까?

그래서, 그것을 자신을 시도하고 다음의 간단한 예를 쓴 다음 the documentation으로

implicit val l = 3 
implicit def equality(implicit l: Int) = new Equality[String] { 
    override def areEqual(a: String, b: Any): Boolean = (a, b) match { 
    case (_, b: Int) => a.toInt == b 
    } 
} 

"Test" should "check how equality works" in { 
    List("1") should contain theSameElementsAs Vector(1) //Fine 
    List("1", "2") should contain theSameElementsAs Vector(1, 2) //Fine 
    List("1", "2", "3") should contain theSameElementsAs Vector(1, 2, 3) //Fine 
    List("1", "2", "2") should contain theSameElementsAs Vector(1, 2, 2) //Error 
    List("2", "1") should contain theSameElementsAs Vector(1, 2) //Error 
} 

을 말한다

은 "contain theSameElementsAs는"구문은 두 집계가 같은 포함 주장 할 수 있습니다 그것은 계정에 중복 및 주문을 받아 안

객체. 그게 뭐가 잘못 됐니? 왼쪽에서 대신 문자열 목록의

답변

1

나는 근본적인 문제가 하나가 예상하는대로 equality 관계, 반사 아니라고 생각합니다. 즉, x == y이면 y == x입니다.

Scalacheck 제공된 equality 함수를 사용하여 목표 컬렉션 count the number of repetitions하려고.

equality(2,2), tryEqualityfails internally with a ClassCastException을 만족하면 비교를 false로 기본값으로 설정합니다.

결론 : 위해 (좋은 오래된 수학 지시로) 반사 할 필요가 Equality는 예상 된 결과를 가지고 있습니다.

+0

전적으로 동의합니다. 평등 [L]의 정확한 계약을 알지 못했습니다. –

0

사용 Int 목록.

"Test" should "check how equality works" in { 
    List(1) should contain theSameElementsAs Vector(1) //Fine 
    List(1, 2) should contain theSameElementsAs Vector(1, 2) //Fine 
    List(1, 2, 3) should contain theSameElementsAs Vector(1, 2, 3) //Fine 
    List(1, 2, 2) should contain theSameElementsAs Vector(1, 2, 2) //Fine 
    List(2, 1) should contain theSameElementsAs Vector(1, 2) //Fine 
    } 

출력 :

[info] Test 
[info] - should check how equality works 
[info] Run completed in 354 milliseconds. 
[info] Total number of tests run: 1 
[info] Suites: completed 1, aborted 0 
[info] Tests: succeeded 1, failed 0, canceled 0, ignored 0, pending 0 
[info] All tests passed. 
+0

아, 그건 내가 :) 원하는 정확히 무슨. 우리가 함축적 인 평등을 제공하지 않는다면 그것은 실제로 그렇게 작동합니다. 하지만 우리가 그렇게한다면 ... 나는 단지 그 모든 합병증으로 나의 특정한 사건을 드러내는 것을 좋아하지 않는다 ... –