[정리] Scala 정리(3) - 패턴 매칭과 함수 합성
스칼라 학교!을 개인적으로 정리한 것입니다.
함수 합성
다음 두 함수가 유용하다고 가정하자.
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))
댓글남기기