Haskell(하스켈) | start

최근 개발기술 관련 블로그 글이나 기사, 혹은 게시판등에서 함수형 프로그래밍(Functional programming) 이라는 단어를 종종 볼 수 있습니다. Java, C++, C#, Python. Javascript 등 현업에서 많이 활용되고 있는 프로그래밍 언어를 학습하는 입장에서는 객체지향 프로그래밍 이라는 말은 수도 없이 보고 들어왔지만 ‘함수형’이라는 말은 좀 낯선 단어입니다.

그럼 함수형 프로그래밍은 어떤 의미인지 간단하게 확인해보겠습니다.

함수형 프로그래밍 특징

  • 순수한(pure) 함수를 지향하므로 부작용(side effect)이 없습니다.
  • 모든 것은 함수 입니다.
  • 상태가 없거나(stateless) 변경 불가능(immutable) 하므로 동시성에 적합니다.
  • 코드의 재사용성이 좋습니다.
  • 간결하게 코드를 작성하기 좋습니다.

위의 이야기 외에 사람의 논리적 사고의 흐름대로 코딩할 수 있어서 좋다고 하지만 이것은 사람마다 다르기 때문에 객관적으로 정의할 수는 없을 것 같습니다.

특징을 적으니 장점을 이야기 한 것 같습니다만, 다른 의견도 있습니다. 너무 함축적인 표현이라서 누구나 쉽게 코드를 읽기 어렵다는 이야기와 공부하기가 어렵다는 이야기,
이미 만들어져 있는 많은 코드가 객체지향적으로 짜여져 있기 때문에 패러다임이 바뀌는 것은 쉽지 않다는 의견 등을 볼 수 있었습니다.

하스켈(haskell)

프로젝트에서의 활용 여부를 떠나서 흥미가 생겨서 관련된 함수형 패러다임에 대한 공부를 하는 겸, 한 언어 정도는 알아보면 좋겠다 싶은 마음이 들었습니다.

함수지향형 언어의 종류는 많습니다.(Lisp, Scala), Closure), Haskell, Caml, F#, Elixir, elm … ). 널리 활용되지는 않는 것 같지만 하나씩 검색해보면 경험해보지 못해서 내가 잘 모르는 것이지 역사도 있고 애용하는 사람들도 많다는 것을 알게 되었습니다.

그 중에 Haskell 이라는 언어를 한번 들여다 보기로 결정하였습니다.

개요

1987년 Functional Programming Languages and Computer Architecture, FPCA ‘87’ 의 회의에서 참가자의 뜻이 모여서 위원회가 발족하여 1990년 첫 버전이 나왔습니다.

하스켈은 순수한 함수형 프로그래밍 언어입니다. 위에서 이야기한 특징을 그대로 가지고 있습니다.

설치(install)

(저는 리눅스 민트(우분투)를 사용하는 관계로 리눅스 환경 중심으로 설치방법을 안내해드리겠습니다. 윈도우, MacOS는 검색해보면 많이 나오니 다른 내용을 참고 하시기 바랍니다.)

하스켈은 다양한 방법으로 설치가 가능합니다만 이번 안내사항은 하스켈의 패키지 시스템인 Stack 을 통해 설치하겠습니다.

1
2
- 패키지를 통해서 필요한 종속성을 확보 합니다.
$ sudo apt-get install g++ gcc libc6-dev libffi-dev libgmp-dev make xz-utils zlib1g-dev git gnupg
1
2
- 설치
$ curl -sSL https://get.haskellstack.org/ | sh
1
2
- 컴파일러 다운로드
$ stack setup

stack 사용법

1
2
- 도움말
$ stack --help
1
2
3
4
5
6
7
8
9
10
- REPL
$ stack ghci
Configuring GHCi with the following packages:
GHCi, version 8.0.2: http://www.haskell.org/ghc/ :? for help
ghci>
- Prelude> -> ghci> 표기 변경
$ vi ~/.ghci 파일 생성
:set prompt "ghci>" 내용 추가
1
2
- 새로운 프로젝트 디렉토리 생성 후 필요한 구성파일 설치
$ stack new <프로젝트 이름>
1
2
- 프로젝트 빌드
$ stack build
1
2
- 프로젝트 실행파일 설치
$ stack install <package-name>
1
2
- 프로젝트 실행
$ stack exec 프로젝트 이름-exe

실무에 필요한 객체지향을 이해하며 공부하는 것도 만만치 않습니다만 호기심을 가지고 틈 날때마다 조금씩 하는 학습은 재미가 있네요. 자료가 많이 있지 않아서 공식 문서를 참고로 작성하였습니다. 혹시 틀린 부분이 있으면 댓글 달아주시면 감사드려요.

haskell functional programming start