복붙노트

[SCALA] 스칼라의 패턴 매칭 시스템에서 비교 연산자를 사용하여

SCALA

스칼라의 패턴 매칭 시스템에서 비교 연산자를 사용하여

그것은 스칼라의 패턴 매칭 시스템을 사용하여 비교 일치 할 수 있습니까? 예를 들면 :

a match {
    case 10 => println("ten")
    case _ > 10 => println("greater than ten")
    case _ => println("less than ten")
}

두 번째 경우 문은 불법입니다,하지만 난 "는보다 큰 경우"를 지정할 수 있도록하고 싶습니다.

해결법

  1. ==============================

    1.당신은 경비를 추가 할 수 있습니다, 즉는 IF와 패턴 후 부울 표현 :

    당신은 경비를 추가 할 수 있습니다, 즉는 IF와 패턴 후 부울 표현 :

    a match {
        case 10 => println("ten")
        case x if x > 10 => println("greater than ten")
        case _ => println("less than ten")
    }
    

    편집 : 가드 사실이 아닌 경우이 이상의 표면적으로는 다른 후 경우를두고하는 것으로 도시 =>, 패턴이 일치하지 않기 때문.

  2. ==============================

    2.술어가 경기 전에 고려 될 수있다이 경우, 일치 절에 조건을 통합하는 방법을 묻는 질문의 정신에 비 답변으로 :

    술어가 경기 전에 고려 될 수있다이 경우, 일치 절에 조건을 통합하는 방법을 묻는 질문의 정신에 비 답변으로 :

    def assess(n: Int) {
      println(
        n compare 10 match {
          case 0 => "ten"
          case 1 => "greater than ten"
          case -1 => "less than ten"
        })
    }
    

    이제 scala.math.Ordering.compare 설명서 (T, T)의 비와 동일한 결과보다 크거나 제로보다 작은 것 만 것을 약속한다. 자바의 필적 #은 compareTo (T)는 스칼라의 유사 지정됩니다. 스칼라의 현재 구현처럼 1과 -1 양과 음의 값을 각각 있지만 하나가 밑으로 변경 구현의 일부 위험없이 이러한 가정을 만들 수 없습니다 사용하는 기존의 될 일이.

  3. ==============================

    3.내 의견으로는 훨씬 더 읽기 경비를 추가하는 것보다 해결책 :

    내 의견으로는 훨씬 더 읽기 경비를 추가하는 것보다 해결책 :

    (n compare 10).signum match {
        case -1 => "less than ten"
        case  0 => "ten"
        case  1 => "greater than ten"
    }
    

    노트:

  4. ==============================

    4.위의 답변을 완벽하게 원래의 질문에 대답 우는 모든 몇 가지 추가 정보가 문서 https://docs.scala-lang.org/tour/pattern-matching.html에서 발견 될 수 있지만, 그들은 내 경우에는 적합하지 않았다 그러나이 유래 대답은 구글 I의 첫 번째 제안은 위의 질문 코너 케이스 내 대답을 게시하고자하기 때문이다. 내 질문은 :

    위의 답변을 완벽하게 원래의 질문에 대답 우는 모든 몇 가지 추가 정보가 문서 https://docs.scala-lang.org/tour/pattern-matching.html에서 발견 될 수 있지만, 그들은 내 경우에는 적합하지 않았다 그러나이 유래 대답은 구글 I의 첫 번째 제안은 위의 질문 코너 케이스 내 대답을 게시하고자하기 때문이다. 내 질문은 :

    어느 의역 할 수있다 :

    답은 아래의 코드 예제입니다 :

        def drop[A](l: List[A], n: Int): List[A] = l match {
          case Nil => sys.error("drop on empty list")
          case xs if n <= 0 => xs
          case _ :: xs => drop(xs, n-1)
        }
    

    스칼라 바이올린 링크 : https://scalafiddle.io/sf/G37THif/2 N <= 0 => XS 문을 사용 할 수있는 N 가드 (있는 경우) 문 (함수의 인자) 경우는 케이스 XS를 볼 수 있습니다.

    나는이 나 같은 사람을 도움이되기를 바랍니다.

  5. from https://stackoverflow.com/questions/1585395/using-comparison-operators-in-scalas-pattern-matching-system by cc-by-sa and MIT license