이번 스칼라 스터디 내용에 currying이 있었으며
지난 번에는 partially applied function이 있었는데 볼 때마다 헤매게 되어 조금 정리해볼까 한다.

  1. currying
 스칼라에서 커링은, 여러 개의 파라미터를 받는 함수를 파라미터 리스트를 받는 함수로 바꾸어준다.
scala> def justFun(a:Int, b:Int){
     | val sum = a + b
     | println("result : " + sum)
     | }
justFun: (a: Int, b: Int)Unit
scala> def curriedFun(a:Int)(b:Int){ | val sum = a + b | println("result : " + sum) | } curriedFun: (a: Int)(b: Int)Unit
그런데 커링을 단순히 함수의 변형으로만 보면 안되는게
커리된 함수를 호출했을 때 파라미터가 전달되는 모습을 내부적으로 보 면 알 수 있다.
scala> justFun(3,4)
result : 7
scala> curriedFun{3}{4} result : 7 scala> val one = curriedFun(3)_ one: Int => Unit = <function1> scala> one(4) result : 7
실제로 수행되는 내역을 보면 위와 같다. 
함수에 첫번째 인자를 넘기면 그 결과로 두번째 인자를 받는 함수가 반환이 되고
반환된 함수에 두번째 인자를 넘기면 기존-커리되지 않은 함수-의 결과가 반환된다.
이를 수학적으로 표현하게 되면, A(x,y)→z 인 함수를 C'A(x)(y)→z 로 바꾸는 걸로 볼 수 있다. 
클로저(closures)를 지원하는 언어에서는 커리된 함수를 쓸 수 있다고 한다.

2. partially applied function
일반적으로 여러개의 파라미터를 받는 함수에 모든 파라미터를 넘기면 fully applied 라고 하며
파라미터의 일부만 넘기면 이를 partially applied 라고 한다.
그리고 이때 파라미터는 _(underscore)가 대신한다.
scala> def fully(a:Int, b:Int, c:Int){
     | val sum = a + b + c
     | println("sum : " + sum)
     | }
fully: (a: Int, b: Int, c: Int)Unit
scala> fully(1,2,3)
sum : 6
scala> val partially = fully _
partially: (Int, Int, Int) => Unit = <function3>
scala> partially(1,2,3)
sum : 6

참고) http://en.wikipedia.org/wiki/Currying 

Posted by zeide
,
갓난 스칼라 스터디 모임이 유년기 커뮤니티로 자라났습니다.

아직 적절한 명칭이 없어서 일단 한국 스칼라 사용자 모임이라고 부릅니다.

http://groups.google.com/group/scala-korea?hl=en

스칼라를 함께 하고 싶으신 분은 어서어서 가입하세요.

위트있는 명칭이 있으면 그룹스에 제안해주시면 됩니다.
Posted by zeide
,
부제: 한국스칼라유저모임을 꿈꿔도 될까.

벌써 4개월전이 되어버린 KSUG의 세미나. 그때 첫 세션이었던 scala라는 언어를 들었을 때 피곤한 몸과 마음에도 왠지 모르게 재밌을 것 같다는 느낌을 받았다. 그리고 5월에 우연(?)하게도 scala스터디에 참여할 수 있는 기회가 생겼다. 사실 나는 프로그래밍의 P도 모르는 유치원아 수준이라서 나름 떨렸지만 어느새 기회를 덥썩 물고는 뻔뻔스럽게도 어떤 자리가 명당인가 파악하고 있었다.

업계 경험도 없고 해본 건 자바 조금, 자바스크립트 조금이라서-제대로 할 줄 아는게 없다는 말-함수형언어라는 것이 정말로 생소했다. 음... 그냥 솔직하게 말하면 이번에 처음 들어봤다. 하하하.
//java
public void main(String [] args){ }
//scala
def main(args: Array[String]) = { }
뭔가 귀여운 맛이 나는 코드라고 생각한다.

var는 var요, val은 val이로다.
중간에 조금 휴식기가 있었지만 5월부터 8월까지 빠짐없이 스터디에 참여한 결과를 전체적으로 보자면

1. 새로운 언어를 배우는 것은 재미있다.
2. 다른 사람과 같이 하면 동기부여가 된다.
3. 자발적 참여는 능력을 향상시킨다.
이렇게 좋은 영향도 있지만

1. 너무 생소하여 삽질을 하다 포기에 빠져버린다.
2. 비교 대상이 극상일 경우 좌절부여가 된다.
3. 능력에 맞지 않은 자발은 타인의 구타본능을 유발한다.
이러한 안좋은 사례도 발생한다.

좋은 사람들을 만나서 즐겁게 스터디를 해서 행복하다.
여러분, 개발자는 좋은 사람입니다!
개발자를 사랑해주세요~ 흑흑.

끝으로 스터디를 이끌어주신(리드보컬&&음료제공&&장소협찬) nephilim, 고맙습니다 :-)
그리고 fupfin님, 너구리님, 맹수님, 오리대마왕님, Outsider님, 아롱님, Miracle님, daclouds님, 윤군님.
모두모두 고생하셨습니다 :-)
(기억나는 분들만 나열했습니다...돌아서면 까먹는지라..)

추가) 스칼라스터디 덕분에 자바를 다시 돌아보게 되었다.
스터디 최고의 적은...아마도 주말근무와 주말에 가는 워크샵이 아닐까?
앗...대안언어축제 얘기는 안썼네요.
Posted by zeide
,

[Scala] 컴파일 에러

Scala 2010. 5. 12. 23:22
Scalac internal error: class java.lang.ClassNotFoundException [java.net.URLClassLoader$1.run(URLClassLoader.java:200), java.security.AccessController.doPrivileged(Native Method), java.net.URLClassLoader.findClass(URLClassLoader.java:188), java.lang.ClassLoader.loadClass(ClassLoader.java:307), sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301), java.lang.ClassLoader.loadClass(ClassLoader.java:252), java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320), java.lang.Class.forName0(Native Method), java.lang.Class.forName(Class.java:169), org.jetbrains.plugins.scala.compiler.rt.ScalacRunner.main(ScalacRunner.java:72)]

책에 나온 예제 코드를 돌렸는데 컴파일하다가 에러가 떴다.
구글링을 하니
It's important to know, what Scala compiler you use, with what libraries.
라고 하시네.

찾아보니까 JDK가 1.6인데 아래 레벨에서는 5.0으로 지정이 되어 있었다.

+)모듈세팅에서 scala 컴파일러 체크하고 apply 클릭
Posted by zeide
,