Scala 함수 연습
Functional Programming in Scala란 책을 읽고 있습니다. 아직 베타판으로 정식으로 출판된것은 아닌데 초기의 난해한 내용에서 제법 재밌게 읽을 수 있는 책으로 바뀌었네요. 그중 함수형 언어로서의 특징을 보여주는 연습문제가 있어 풀이겸 적어봅니다. 함수형 언어의 특징중 하나는 함수 자체가 하나의 값이고 인자로 주거나 받을 수 있다는 것입니다.
def curry[A,B,C](f:(A,B)=>C):A=>(B=>C) = a => (b => f(a,b))
암호같이 보이는 함수 curry는 2개의 인자를 받아 값을 반환하는 함수 f를 인자로 받아 다른 함수를 반환하는데 그 함수는 하나의 값을 주면 인자 하나를 받아 원래 함수값을 계산하게 됩니다. 예로 이해하는게 쉽습니다.
// plus는 새로운 함수 val plus = curry((a:Int, b:Int)=>a+b) // 하나의 값을 받아서 다른 함수를 반환 val n1 = plus(1) // 그 함수에 다른 값을 주면 원래 함수가 하는 일을 한다. 결과는 3 val n2 = n1(2)
curry 함수를 풀어주는 함수입니다.
def uncurry[A,B,C](f:A=>(B=>C)):(A,B)=>C = (a,b) => f(a)(b) val plustwo = uncurry(plus) plustwo(1,2)
다음은 2개의 함수를 받아 하나의 함수로 만들어주는 함수 compose와 그 예입니다. 숫자가 짝수인지 확인해 주는 함수와 문자열의 길이를 받는 함수를 합쳐 문자열의 길이가 짝수인지 확인하는 함수를 만듭니다.
def compose[A,B,C](f:B=>C, g:A=>B):A=>C = a => f(g(a)) val evenLength = compose((n:Int) => n%2==0, (s:String) => s.length) evenLength("Hello!")
댓글