스칼라의 패턴 매칭 시스템을 사용하여 비교할 수 있습니까? 예를 들면 다음과 같습니다.
a match {
case 10 => println("ten")
case _ > 10 => println("greater than ten")
case _ => println("less than ten")
}
두 번째 사례 진술은 불법이지만 "a가보다 클 때"를 지정할 수 있습니다.
스칼라의 패턴 매칭 시스템을 사용하여 비교할 수 있습니까? 예를 들면 다음과 같습니다.
a match {
case 10 => println("ten")
case _ > 10 => println("greater than ten")
case _ => println("less than ten")
}
두 번째 사례 진술은 불법이지만 "a가보다 클 때"를 지정할 수 있습니다.
답변:
술어를 일치 절에 통합하는 방법을 묻는 질문의 정신에 대한 비 응답으로,이 경우 술어는 match
:
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)
동일하지 않은 결과가 0 보다 크 거나 작을 것이라는 약속 만합니다 . Java Comparable#compareTo(T)
는 Scala와 유사하게 지정됩니다. 스칼라의 현재 구현 에서와 같이 각각 양수 및 음수 값에 1과 -1을 사용하는 것이 일반적 이지만, 구현 이 아래에서 변경 될 위험이 없으면 그러한 가정을 할 수 없습니다.
compare()
하고 compareTo()
0, 1 및 -1을 공동 도메인으로 지정하지 않는 것이 흥미 롭습니다 .
내 의견으로는 경비원을 추가하는 것보다 훨씬 읽기 쉬운 솔루션입니다.
(n compare 10).signum match {
case -1 => "less than ten"
case 0 => "ten"
case 1 => "greater than ten"
}
노트:
Ordered.compare
이 값이 이보다 작 으면 음의 정수를 반환하고, 크면 0
같고 같으면 양수를 반환
합니다.Int.signum
압축의 출력 compare
에 -1
음의 수 (10 개 미만)의 경우, 1
양극 (10 이상)에, 또는 0
영 (10와 동일).위의 답변과 아래 답변 모두 원래 질문에 완벽하게 답변하지만 일부 추가 정보는 https://docs.scala-lang.org/tour/pattern-matching.html 설명서에서 찾을 수 있지만 내 경우에는 맞지 않습니다. 그러나이 stackoverflow 답변은 Google의 첫 번째 제안이므로 위 질문의 모퉁이 인 답변을 게시하고 싶습니다.
내 질문은 :
어떤 말로 표현할 수 있습니까?
대답은 아래 코드 예입니다.
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)
}
scala fiddle에 링크 : https://scalafiddle.io/sf/G37THif/2
보시 다시피 case xs if n <= 0 => xs
명령문은 guard (if) 문과 함께 n (함수 인수)을 사용할 수 있습니다.
나는 이것이 나와 같은 누군가를 돕기를 바랍니다.
case x if x.size > 2 => ...