함수형언어를 배워보려고 합니다.

geneven의 이미지

애자일 이야기에서 Erlang을 소개한 글을 보고,
SICP라는 책도 알게 되면서 자연스레 함수형 언어에 관심이 생겼습니다. 특히 Erlang의 경우 "분산/병렬/동시성 프로그래밍을 적극적으로 지원하는 언어"라는 소개글이 최근의 CPU가 멀티코어로 가게되면서 딱 들어맞는 말이 아닌가 싶어 공부하려고 하는데, Erlang또는 다른 함수형언어중에 초보자가 시작하기에 좋은(커뮤니티가 있고 많은 문서가 있는)언어 하나를 추천해주셨으면 합니다.

gamdora의 이미지

함수형 프로그래밍의 모든 것에서 Haskell과 Scheme을 다룹니다.

semmal의 이미지

저도 써본적은 없지만 erlang은 아마도 좋은 선택이라 생각합니다. 여기저기서 쓰이는 것도 많이 봤고, 대부분 호평이많았습니다. 저도 공부할 계획이예요.

여러모로 lisp이나 scheme이 좋지 않을까 싶습니다만, 아주 간단한 문법에 비해서, Common Lisp같은 경우에는 깊게 들어가면 아주 복잡해집니다. 하지만 상업적인 목적으로도 쓸 수 있는 만큼, 많은 것을 할 수 있습니다. 역사가 오래된만큼 커뮤니티는 가장 방대하지 않을까 싶네요.

Haskell의 경우에는 문법이 쉽고 예뻐서 초보자들이 쓰기에 편하지만, 조금만 더 들어가면 여러가지 수학 이론 기반이 없으면 여러모로 이해하기 힘듭니다. 여러가지 라이브러리가 부족하고 여러가지 이유로 상업적으로 쓰기에는 무리가 있습니다. 하지만 개념을 쌓고 프로그래밍을 손에 익히는데는 정말 좋은 것 같습니다. 마치 문법이 생각을 이끄는 듯 하거든요.

ML은 Haskell과 비슷한 문법을 가지고 있지만, 조금 더 복잡하고 쓰기 어렵습니다. 하지만 그 성능이나 적용분야는 나무랄데가 없어서 많은 곳에서 쓰이고 있습니다. 마찬가지로 커뮤니티나 문서는 Lisp만큼 쉽게 구할 수 있으리라 생각합니다.

Clean은 Haskell만큼 깔끔하고 예쁜 문법을 가지고 있습니다. 써본적은 없지만 상용으로 만들어진 것이라 역시 괜찮은 걸로 알고 있습니다.
------------------------------
How many legs does a dog have?

------------------------------
How many legs does a dog have?

lagendia의 이미지

(standard) ML은 imperative 형 언어를 과거에 다루어 보셨다면 추천합니다.
statement가 끝나고 세미콜론을 찍는다거나(선택사항 이지만) 하는 모습이 비슷합니다.
semmal님이 말씀하신 것처럼 ML for the working programmer(2nd, Cambridge)에서 실무에 적용되는 ML을 다루고 있습니다.
한국에서 방언으로 만든 nML도 있습니다.

sliver의 이미지

Ocaml과 Haskell 둘 다 써봤는데요, 저는 Haskell이 더 어렵더군요.
ML같은 경우는 eager evaluation이어서 C와 마찬가지로 시간/공간복잡도나 수행속도가 어느 정도 예측되는 코드를 작성하기 쉬운데
Haskell은 lazy evaluation을 하다 보니 언제 어느 경우에 어떠한 계산식이 실제로 계산되는지 예측하기가 힘들어서 복잡도나 수행속도를 예측할 수 있는 코드를 작성하기 꽤 어렵더군요 (저만 그런건지 일반적으로 그런건지는 잘 모르겠습니다만...ㅜ.ㅜ)
또 순수함수형이다 보니 IO도 다른 언어에 비해 까다로운 편이구요.
그냥 저와 다르게 생각하시는 분이 계시길래 끄적여 봤습니다 :)

M.W.Park의 이미지

실무에도 적용하실 것이라면 일단은 lisp을 추천합니다.
요즘 실무에서 조금씩 고차원적인 모듈은 lisp으로 몇개 구현해보았는데 결과가 아주 만족스럽습니다.

그러나, 순수하게 공부하는 목적이라면 scheme이 좋을 것도 같네요.

erlang은 좋다는 이야기 듣고 책만 사놓은지라 잘은 모르지만, 그래도 미션 크리티컬한 대형 통신회사에서 실제 시스템에 쓰고있다는 것이 성능이나 안정성을 일단은 담보하고 있다는 생각이 듭니다.

무엇을 공부하더라도 (특히 이전에 공부한 적이 없다면), 함수형 언어라면 재미있는 시간이 될 것이라는 것에 100원 정도는 걸 수 있습니다. ^^;

-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

gurugio의 이미지


엉뚱한 질문입니다만..

scheme 문법을 배운 후에 common-lisp 등 lisp를 공부하면 많이 혼동되나요?
많은 분들이 scheme와 lisp를 다른 언어같이 말씀을 하셔서
c/c++같이 겉모양만 비슷한건지 궁금합니다.

... SCIP책 정말 어렵네요.. 연습문제 하나하나 골치아픕니다..어흑.

----
세상을 바꾸는 것은 단 한 사람. 오직 하나님의 사람뿐이다.

M.W.Park의 이미지

일전에 비슷한 주제의 답글을 작성한 적이 있습니다.
http://kldp.org/node/88727#comment-420054
원론적으로는 거의 비슷하다고 보시면되지만, 세세하게는 좀 차이가 납니다.
하나를 공부한 직후에 다른 것들을 바로 공부한다면 좀 헷갈리는 부분이 생길지도 모릅니다만, 공유하는 이론적인 배경이 동일하기 때문에 아마 크게 문제는 없을겁니다.

-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

gurugio의 이미지


정말 죄송합니다만 한가지만 더 여쭤볼 수 있을까요..

lambda의 개념이나 필요성이 잘 이해가 안되고 있습니다.
왜 하나의 철학으로까지 거론되는지도 모르겠구요.
lambda에 대해 잘 설명해주는 자료를 혹시 아시는지요..

자꾸 번거롭게 해드려서 죄송합니다.

----
세상을 바꾸는 것은 단 한 사람. 오직 하나님의 사람뿐이다.

M.W.Park의 이미지

다음 URL의 책에서 Chapter5를 참고하세요
http://www.cs.uiowa.edu/~slonnegr/plf/Book/
제법 잘 설명되어있습니다.

정확하지 않은 기억이지만, 수학계에서 lambda calculus가 무엇인가를 계산하기 위한 방법론으로 대두되고 그 이후에 전산적으로 구현된 구현체가 함수형 언어들인것으로 알고 있습니다.

함수형 언어(lisp, scheme등)에서의 함수라는 것이 해석되어 실행되는 방식이나 표기법등을 보시면 lambda calculus와의 연관성을 유추하실 수 있을 듯합니다.

그리고 죄송하다는 말씀은 하지 마세요. 공통의 관심사를 가진 사람을 만나는 것만으로도 즐거움이라 생각합니다.

-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

totohero의 이미지

저도 같은 의문을 가져 여기 저기 자료를 좀 찾아보았는데요, Wikipedia의 Lambda Calculus 페이지로부터 시작하는 것도 괜찮을 듯 합니다.

처음에 저는 컴퓨터란 무엇인가?라는 질문으로부터 시작했습니다. lambda calculus는 Turing machine과 더불어, 컴퓨터를 표현할 수 있는 가장 간단한 언어라고 할 수 있겠습니다. lambda calculus와 Turing machine은 둘다 1935년 쯤에 Hilbert의 decision problem을 푸는 과정에서 컴퓨터 혹은 알고리즘의 의미를 정의하기 위해 발명된 수단입니다. 각각 Alonzo Church와 Alan Turing에 의해 발표되었는데 제겐 마치 미적분이 라이프니츠와 뉴튼에 의해 동시에 발명된 것처럼 신기하게 느껴지더군요.

아무튼, lambda calculus 및 Turing machine 모두 오늘날의 컴퓨터나 컴퓨터 언어 혹은 그것들로 표현 가능한 알고리즘을 모두 기술할 수 있는 수단인데, Turing machine이 아무래도 실리콘으로 만들어내는 오늘날의 실제 컴퓨터의 구현에 더 가깝기 때문에 컴퓨터의 태동기부터 실제 모델로 널리 활용된 것 같습니다. Von Neumann machine도 Turing machine의 복잡한 version 정도로 볼 수 있겠고요, C와 같이 변수(storage)와 연산, 대입 (combination logic)으로 구성되는 명령형 언어도 Turing machine으로 쉽게 환원이 되지요.

반면, lambda calculus는 Turing machine과 computability는 똑같지만, 주어진 문제를 풀기 위한 machine을 정의하는 것이 아니라 그냥 문제를 lambda calculus로 정의하기만 하면 된다랄까요? implementation 위주가 아니라 application 위주라는 표현을 쓰면 될지 모르겠습니다. (John Backus의 Can Programming Be Liberated From the von Neumann Style? 참고) 아무튼 lambda calculus(혹은 이를 활용한 fp language)는 문제를 좀더 쉽게 정의할 수 있다는 측면에서 일반적인 programmer에게 유리하지만, fp로 정의된 문제를 실제 Turing machine에 mapping하기는 쉽지 않으므로 compiler 혹은 processor desinger에겐 더 많은 숙제를 안겨줄 것입니다. 하지만 어셈블리 -> low level language -> high level language로 발전해왔듯, 앞으로 더욱 증가할 application의 복잡도에 대응하기 위해선 결국 implementation에 덜 억매이고 더 abstract한 lambda calculus에 기반한 fp의 시대가 도래할 것이라 여겨집니다. 물론 low level language의 대표격인 C가 망할거란 말은 아닙니다. ^^

cleol의 이미지

"커뮤니티가 있고 많은 문서가 있는" 인 조건에는 아마도 Haskell 이 가장 잘 맞지 않을까요? 제 제한된 경험에 비추어본 결과이지만 아마도 그럴 것 같습니다. LISP 도 꽤 많은 사용자와 문서가 있는 것 같지만, Haskell 처럼 조직적(?) 이지는 않은 것 같아서요. 그리고 역시 단지 느낌이지만, 사용자가 점점 늘어나는 추세에 있는 것 같구요.

jj의 이미지

Most popular functional languages on Linux
http://ocamlnews.blogspot.com/2007/11/most-popular-functional-languages-on.html

--
콘쏠의힘

--
Life is short. damn short...

소리의 이미지

아는 게 Haskell 밖에 없어, Haskell을 추천하겠습니다.

문서도 풍부하고, 사용자도 많고, 연구도 활발하며, 쉽고 간결하고도 강력한 함수형 언어입니다.

다른 함수형 언어도 마찬가지일 것으로 추측하지만, Haskell을 알고 나면 명령형 프로그램을 할 때마다 얼마나 자주 'Haskell이었으면 이거 한줄에 끝낼 수 있는 건데' 하며 아쉬워하게 되는지 모릅니다. 예를 들어 Java로 Parser Combinator를 대신해야 한다고 생각하면 얼마나 끔찍한지 모릅니다.

컴파일러는 결국엔 GHC나 Hugs를 쓰게 되지만, 시작은 Helium이라는 교육용 컴파일러로 하는 것도 괜찮습니다. 에러 메시지가 엄청 친절하거든요. (어떻게 고치라고 말해주기까지 하는데, 시키는대로 하면 대부분 맞습니다. -.-) Hint라는 대화형 인터페이스도 지원해서 학습용으로는 정말 최적입니다.

Helium 홈페이지: http://www.cs.uu.nl/helium/
Haskell 가이드: http://www.haskell.org/learning.html

hongminhee의 이미지

저 같은 경우 학습용으로는 Haskell, Scheme이 좋았습니다.