gimmesilver's blog

Agbird.egloos.com

포토로그



하스켈로 펙토리얼 함수를 만드는 24가지 방법... 하스켈 스프링노트

원문 보기: The Evolution of a Haskell Programmer

예전에 본 Hello world 프로그램 짜기에 관한 유머를 연상케 하는 글...
Haskell.org 에는 유머라고 분류해 놓았긴 하지만 단순히 유머라 하기엔 하스켈에서 지원하는 람다식, 패턴매칭, points-free, continuation-passing, accumulating recursive 등등의 다양한 기법들을 한번에 접할 수 있어 유용한 글 인듯...
밑으로 가면 말도 안되는 소스가 나오는데 그건 무시...^^

참고로 가장 적은 글자수로 구현한 펙토리얼 함수는 아래와 같다. (위 글에 의하면 종신 재직 교수의 방법 ^^)
f n=product[1..n]
빈칸 포함 17자...

원문에 보면 모나드를 사용한 방법이 없어서 아쉽다는 말이 나오는데...
방법이야 무궁무진 하지만 이런 문제에는 모나드가 어울리진 않는다.

어쨌든 당장 생각나는 방법은 IORef 를 사용하는 방법인데 아래와 같다.

import Data.IORef
import Monad

fac n = newIORef 1 >>= (\x->fac' n x >> readIORef x)
fac' n ret = when (n>0) (readIORef ret >>= (\x
        -> writeIORef ret (x*n) >> fac' (n-1) ret))


핑백

  • 중요한건 언어가 아니랍니다. : 하스켈 2008-03-06 19:54:39 #

    ... 하스켈로 펙토리얼 함수를 만드는 24가지 방법...최근에 '컴퓨터 프로그램의 구조와 해석(SICP)'라는 한글 번역본으로 LISP 공부해보자는 분위기가 여러 프로그래밍 카페에서 보이던데.. 개인적 ... more

덧글

  • 백승우 2008/03/06 19:56 # 답글

    아래쪽으로 가면 갈 수록.. 소스가 haskell 답지 않게 길어지네요 ^^
    언젠가 자바에 디자인패턴 매니아를 비꼬는듯한 여러가지 패턴을 이용해서 hello world를 작성했던 소스가 생각납니다.
  • silverbird 2008/03/07 14:53 # 답글

    // 백승우
    뭐 하스켈이라고 소스가 꼭 짧으라는 법은 없죠 ^^
    어쨌든 재밌는게 많습니다.
    예를 들어 원문에서 Static Haskell programmer 는 C++의 템플릿처럼 타입 체크시에 계산을 수행하도록 만든 소스이고
    Interpretive Haskell programmer 는 내부적으로 펙토리얼 계산에 필요한 문법만 가진 언어를 새로 정의한 후, 해당 언어로 펙토리얼 프로그램을 짜서 실행하도록 만든 소스죠...그러니 길어질 수 밖에요...^^
  • 하스 2008/05/17 13:36 # 삭제 답글

    간단히 말해서, 하스켈과 같은 함수형언어가 C/C++에 비해서 어떤 장점이 있습니까?
  • silverbird 2008/05/19 10:57 # 답글

    // 하스
    관점에 따라 장점일수도 아닐수도 있겠지만...
    1. 함수형 프로그래밍이라는 패러다임을 익히는데 매우 좋은 언어입니다. - 따라서 C/C++만 익혔을때는 얻기 힘든 다른 사고를 접할 수 있습니다.
    2. C/C++에 비해 문법이나 제공되는 라이브러리가 직관적이고 함축적입니다. - 그럼에도 불구하고 루비나 파이썬같은 스크립트 언어에 비해 훨씬 빠르고 메모리도 적게 차지합니다.
    3. 요즘 많이 이슈가 되고 있는 closure, curry, Software Transaction Memory(STM) 같은 최신 프로그래밍 기법들이 거의 대부분 들어가 있습니다.
    4. 멀티스레드 프로그래밍을 위해 지원되는 기능들이 편의성이나 성능면에서 매우 뛰어납니다. - C/C++에 비해 스레드 생성/전환 성능이 8배 가량 빠르다는 벤치마크 결과가 있습니다.
댓글 입력 영역