[Scala] Partial Function

smlee·2023년 10월 2일
0

Scala

목록 보기
34/37
post-thumbnail

Partial Function

직역하면 Partial Function은 부분 함수이다. 이를 풀어 쓰면 다음과 같다. f:X → Y인 함수에 대한 부분 함수는 g:X' → Y이다. 이때, X'는 X의 subset이다.라는 것이 Partial Function의 정의이다.

스칼라의 partial function가능한 입력 인자의 서브셋에 대해서만 정의된 함수를 뜻한다. Partial Function의 좋은 예시 중에는 나눗셈이 있다. 나눗셈은 분모의 input이 0이 아닌 모든 실수 subset에 관해 정의된 함수이다. 이를 코드로 나타내면 다음과 같다.

val div: (Double, Double) => Double = {
	case (x,y) if y!=0 => x/y
}

즉, 2개의 인자가 입력되었을 때 분모를 나타내는 y가 0이 아닌 경우 x/y를 리턴하는 것이다. 이를 실제 실행시켜보면 다음과 같이 동작한다.

우리는 위의 실행화면에서 div(1,0), 즉 분모가 0이 입력되는 예외가 발생했을 때 MatchError가 발생하는 것을 알 수 있다. 그리고 위에서는 나와있지 않지만 입력인자가 유효한 값의 서브셋이라면 테스트할 방법이 없다는 것이다.(대신 함수 자체를 호출한다.)

스칼라는 위의 문제점들을 해결하기 위해 PartialFunction이라는 trait를 제공한다. PartialFunction을 사용하여 함수를 정의한다면 입력 인자에 정의되었는지 검사할 뿐만 아니라 누락된 패턴을 경고하지 않을 것이다.

위의 예시를 PartialFunction을 사용하면 다음과 같이 나타낼 수 있다.

val div: PartialFunction[(Double,Double), Double] = {
    case (x,y) if y!= 0 => x/y
}

PartialFunction 내부에는 2개의 타입이 들어간다. 위에서는 [(Double, Double), Double]이지만 간략히 하면 [A, B]의 형태이다. 이는 PartialFunctionA 타입이 input으로 들어가고 output으로 B 타입의 값이 나온다는 의미이다.

다시 예제로 돌아가서, 위의 예제는 맨 처음 예제와 다를 것이 없어보인다. 하지만, 유일한 차이점으로 PartialFunctionisDefinedAt이라는 메서드를 통해 해당 input에 대해 처리할 수 있는지를 알려준다.

타입 오류 역시 검출해주며, 정의되어 있지 않은 연산은 false를 리턴하여 누락된 패턴에 대해 미리 검사하여 이상이 없을지 여부를 검증할 수 있다.

Reference

0개의 댓글