[정리] Scala 정리(3) - 패턴 매칭과 함수 합성

1 분 소요

스칼라 학교!을 개인적으로 정리한 것입니다.

함수 합성

다음 두 함수가 유용하다고 가정하자.

scala> def addUmm(x: String) = x + " umm"
// addUmm: (x: String)String

scala>  def addAhem(x: String) = x + " ahem"
// addAhem: (x: String)String

compose

val ummThenAhem = addUmm _ compose addAhem _
// ummThenAhem: (String) => String = <function1>

scala> ummThenAhem("well")
// res0: String = well umm ahem

andThen

compose의 반대

scala> val ahemThenUmm = addAhem _ andThen addUmm _
// ahemThenUmm: (String) => String = <function1>

scala> ahemThenUmm("well")
// res1: String = well ahem umm

커링(Currying)과 부분적용(Partial Application)

Case문

  • PartialFunction 함수의 하위 클래스
  • 여러 케이스 문이 합쳐진 것은 PartialFunction을 compose한 것

PartialFunction

  • 함수는 정의된 모든 인자 값에 대해 반드시 동작한다. (Int) => String으로 정의된 함수는 어떤 Int에 대해서는 반드시 String을 반환한다.
  • 부분함수는 인자 타입의 값 중 일부에 대해서만 정의되어 있다. (Int) => String으로 정의되어 있더라도 특정 Int에 대해서 작동하지 않을 수 있다.

    NOTE PartialFunction(부분함수)는 Partial Application(부분적용)과는 다르다.

isDefinedAt 함수는 PartialFunction에 정의 되어 있는 메소드로 주어진 인수를 받을 수 있는지 알려준다.

scala> val one: PartialFunction[Int, String] = { case 1 => "one" }
// one: PartialFunction[Int,String] = <function1>
scala> one.isDefinedAt(1)
// res0: Boolean = true

scala> one.isDefinedAt(2)
// res1: Boolean = false

PartialFunction들은 orElse라 불리는 다른 함수를 사용해 함성 가능하다. orElse는 각 PartialFunction이 인자 값에 대해 정의되어 있는지 여부에 따라 적절한 최종 값을 반환한다.

scala> val two: PartialFunction[Int, String] = { case 2 => "two" }
// two: PartialFunction[Int,String] = <function1>

scala> val three: PartialFunction[Int, String] = { case 3 => "three" }
// three: PartialFunction[Int,String] = <function1>

scala> val wildcard: PartialFunction[Int, String] = { case _ => "something else" }
// wildcard: PartialFunction[Int,String] = <function1>

scala> val partial = one orElse two orElse three orElse wildcard
// partial: PartialFunction[Int,String] = <function1>

scala> partial(5)
// res24: String = something else

scala> partial(3)
// res25: String = three

scala> partial(2)
// res26: String = two

scala> partial(1)
// res27: String = one

scala> partial(0)
// res28: String = something else

케이스 문을 함수가 필요한 위치에 넣기

scala> case class PhoneExt(name: String, ext: Int)
// defined class PhoneExt

scala> val extensions = List(PhoneExt("steve", 100), PhoneExt("robey", 200))
// extensions: List[PhoneExt] = List(PhoneExt(steve,100), PhoneExt(robey,200))

scala> extensions.filter { case PhoneExt(name, extension) => extension < 200 }
// res0: List[PhoneExt] = List(PhoneExt(steve,100))

댓글남기기