Haskell
Study
0. 스터디 소개
스터디 목표
•	 Haskell 기초 문법 및 함수형 언어의 개념 이해(1차 목표)
상세한 이론적인 지식을 배우기보다는 실습 위주로 함수형 언어의 개념을 느낌적으로 이해하고,
Haskell로 작성된 코드를 보는데 무리가 없을 정도의 기초 문법 지식 습득하기
•	 Haskell로 응용 프로그램 만들어 보기(2차 목표)
wxHaskell 등의 라이브러리를 이용해서 Haskell로 간단한 실제 응용 프로그램을 만들어보는 것
스터디 방식
•	 문법 및 개념 습득
Haskell의 기본 문법 및 연관된 개념들 익히기
•	 연습
배운 문법으로 간단한 실습 및 연습 문제를 풀어보는 과정을 통해 개념에 익숙해지기
•	 코드 리뷰
서로가 작성한 코드를 비교하면서 다양한 풀이 방법 익히기
Haskell 특징
•	 순수 함수형 언어
C/C++, Java 등의 명령형 언어와 다르게 함수 수행의 부작용(side effect)이 없는 언어. 변수에
값이 한 번 할당되면 값을 절대 변경할 수 없습니다. 이 특성 때문에 함수가 같은 인자를 가지고
호출됐다면 반드시 같은 결과가 나오는 특성(참조 투명성 - referential transparency)이
보장됩니다.
f(5) = 5
...
f(5) = ?
명령형 언어
이 시점에 f(5) = 5 였어도
시간이 지난 후 다시 호출했을
때 f(5) =5 라고 장담할 수 없다
f(5) = 5
...
f(5) = 5
순수 함수형 언어
이 시점에 f(5) = 5 였다면
언제 호출하든 f(5)의 결과는
반드시 5가 된다
Haskell 특징
•	 지연 계산 (lazy evaluation)
Haskell은 계산의 결과가 진짜 필요해지기 전까지는 실제로 계산을 수행하지 않습니다. 계산 결과가
필요할 때 바로 계산하지 않고 계산을 수행하겠다는 일종의 약속을 저장하고 있다가 진짜 그 계산이
필요해지는 시점이 오면 그 때 계산을 수행하는 식으로 동작하죠. 이런 특성 덕분에 무한대 크기의
리스트 등을 다룰 수 있습니다.
x = f ( f ( f ( 5 ) ) )
라는 계산식을 써도 이 시점에서 바로 결과를 계산하지 않습니다. 실제 이 계산의 결과가 필요한
시점이 오면 그 때서야 계산.
x 값 요구 -> f ( f ( f ( 5 ) ) )에서 f의 결과 요구 -> f ( f ( 5 ) ) 에서 f의 결과 요구 -> f (5) 계산
-> 결과 순서대로 반환해서 x 값 얻음.
즉 x 값을 요구하기 전까진 위에 적힌 식을 계산하겠다는 약속만 저장해두고 실제로 계산하지는
않습니다.
Haskell 특징
•	 정적 타입 & 타입 추론
Haskell은 완전한 정적 타입 언어입니다. 모든 값에는 타입이 붙어있고 타입 체크를 굉장히 엄격하게
해요. 또 타입 시스템 클래스를 이용해 Haskell 특유의 다형성을 구현할 수 있으며 타입 추론 능력이
굉장히 강력해서 거의 모든 경우에 컴파일러가 알아서 타입을 추론해줍니다. 이런 특징 덕분에 코드가
간결해지며 컴파일 타임에 상당히 많은 양의 버그를 잡아낼 수 있습니다.
Tool
•	 GHC 컴파일러(https://www.haskell.org/platform/)
Haskell의 대표적인 컴파일러입니다. 인터프리터인 GHCi도 같이 설치되며 이 인터프리터를 이용해
작성한 코드를 쉽게 테스트해볼 수 있습니다.
•	 Brackets(http://brackets.io/)
유명한 텍스트 에디터. Haskell syntax highlight를 지원하기 때문에 가볍게 쓰기 좋습니다.
•	 Leksah (http://leksah.org/)
Haskell로 만들어진 오픈 소스 Haskell IDE. 가장 유명하고 기능도 강력한 것으로 알려져 있습니다.
참고 자료
•	 Learn You a Haskell For Great Good!
http://learnyouahaskell.com/chapters에서 무료로 내용을 볼 수 있다(영어). 한글판 서적 ‘
가장 쉬운 하스켈 책’ 도 시중에 나와있으니 이 걸 사 봐도 됩니다. 하지만 번역본의 질이 그리 좋은
편이 아니고, 중간에 라이브러리 함수 소개하는 부분도 생략되어있어 번역본은 강추할만한 수준은
아님. 인터넷에도 간간히 번역된 자료가 있으며 제 블로그(jwvg0425.tistory.com)에도 8장
즈음까지 번역되어 있습니다.
•	 Real World Haskell
위 책보다 조금 더 난이도가 있는 책입니다. 꽤 세세한 부분까지 다루며 뒷부분에는 실제 응용까지
많이 수록되어 있어 기본 문법에 어느 정도 익숙해지고 나서 보기 좋습니다. 아쉽게도 번역본은 없는
듯. 이 책도 http://book.realworldhaskell.org/read/ 에서 무료로 볼 수 있습니다.
참고 자료
•	 하스켈로 배우는 함수형 프로그래밍
얼마 전에 제이펍에서 출간된 책입니다. 개념을 아예 모르는 상태에서 보기엔 조금 어려운 편이며 타
명령형 언어들(C++, Java 등)과의 비교를 중심으로 내용을 전개하는 서적입니다.
•	 Hoogle, Haskell Wiki
Haskell로 프로그램을 짜다 보면 수시로 들락날락거려야하는 사이트들입니다. Haskell 내부
함수들이나 Haskell에서 특정 목적의 프로그램을 짜는 법 등등의 정보가 거의 대부분 나옵니다. 사실
그냥 구글에서 관련 정보 나오면 알아서 뜨기 때문에 크게 중요하진 않지만...
그 외에도 Haskell 공식 홈페이지만 가도 유용한 튜토리얼 자료들 및 문서들이 굉장히 많습니다.

Haskell study 0

  • 1.
  • 2.
    스터디 목표 • Haskell기초 문법 및 함수형 언어의 개념 이해(1차 목표) 상세한 이론적인 지식을 배우기보다는 실습 위주로 함수형 언어의 개념을 느낌적으로 이해하고, Haskell로 작성된 코드를 보는데 무리가 없을 정도의 기초 문법 지식 습득하기 • Haskell로 응용 프로그램 만들어 보기(2차 목표) wxHaskell 등의 라이브러리를 이용해서 Haskell로 간단한 실제 응용 프로그램을 만들어보는 것
  • 3.
    스터디 방식 • 문법및 개념 습득 Haskell의 기본 문법 및 연관된 개념들 익히기 • 연습 배운 문법으로 간단한 실습 및 연습 문제를 풀어보는 과정을 통해 개념에 익숙해지기 • 코드 리뷰 서로가 작성한 코드를 비교하면서 다양한 풀이 방법 익히기
  • 4.
    Haskell 특징 • 순수함수형 언어 C/C++, Java 등의 명령형 언어와 다르게 함수 수행의 부작용(side effect)이 없는 언어. 변수에 값이 한 번 할당되면 값을 절대 변경할 수 없습니다. 이 특성 때문에 함수가 같은 인자를 가지고 호출됐다면 반드시 같은 결과가 나오는 특성(참조 투명성 - referential transparency)이 보장됩니다. f(5) = 5 ... f(5) = ? 명령형 언어 이 시점에 f(5) = 5 였어도 시간이 지난 후 다시 호출했을 때 f(5) =5 라고 장담할 수 없다 f(5) = 5 ... f(5) = 5 순수 함수형 언어 이 시점에 f(5) = 5 였다면 언제 호출하든 f(5)의 결과는 반드시 5가 된다
  • 5.
    Haskell 특징 • 지연계산 (lazy evaluation) Haskell은 계산의 결과가 진짜 필요해지기 전까지는 실제로 계산을 수행하지 않습니다. 계산 결과가 필요할 때 바로 계산하지 않고 계산을 수행하겠다는 일종의 약속을 저장하고 있다가 진짜 그 계산이 필요해지는 시점이 오면 그 때 계산을 수행하는 식으로 동작하죠. 이런 특성 덕분에 무한대 크기의 리스트 등을 다룰 수 있습니다. x = f ( f ( f ( 5 ) ) ) 라는 계산식을 써도 이 시점에서 바로 결과를 계산하지 않습니다. 실제 이 계산의 결과가 필요한 시점이 오면 그 때서야 계산. x 값 요구 -> f ( f ( f ( 5 ) ) )에서 f의 결과 요구 -> f ( f ( 5 ) ) 에서 f의 결과 요구 -> f (5) 계산 -> 결과 순서대로 반환해서 x 값 얻음. 즉 x 값을 요구하기 전까진 위에 적힌 식을 계산하겠다는 약속만 저장해두고 실제로 계산하지는 않습니다.
  • 6.
    Haskell 특징 • 정적타입 & 타입 추론 Haskell은 완전한 정적 타입 언어입니다. 모든 값에는 타입이 붙어있고 타입 체크를 굉장히 엄격하게 해요. 또 타입 시스템 클래스를 이용해 Haskell 특유의 다형성을 구현할 수 있으며 타입 추론 능력이 굉장히 강력해서 거의 모든 경우에 컴파일러가 알아서 타입을 추론해줍니다. 이런 특징 덕분에 코드가 간결해지며 컴파일 타임에 상당히 많은 양의 버그를 잡아낼 수 있습니다.
  • 7.
    Tool • GHC 컴파일러(https://www.haskell.org/platform/) Haskell의대표적인 컴파일러입니다. 인터프리터인 GHCi도 같이 설치되며 이 인터프리터를 이용해 작성한 코드를 쉽게 테스트해볼 수 있습니다. • Brackets(http://brackets.io/) 유명한 텍스트 에디터. Haskell syntax highlight를 지원하기 때문에 가볍게 쓰기 좋습니다. • Leksah (http://leksah.org/) Haskell로 만들어진 오픈 소스 Haskell IDE. 가장 유명하고 기능도 강력한 것으로 알려져 있습니다.
  • 8.
    참고 자료 • LearnYou a Haskell For Great Good! http://learnyouahaskell.com/chapters에서 무료로 내용을 볼 수 있다(영어). 한글판 서적 ‘ 가장 쉬운 하스켈 책’ 도 시중에 나와있으니 이 걸 사 봐도 됩니다. 하지만 번역본의 질이 그리 좋은 편이 아니고, 중간에 라이브러리 함수 소개하는 부분도 생략되어있어 번역본은 강추할만한 수준은 아님. 인터넷에도 간간히 번역된 자료가 있으며 제 블로그(jwvg0425.tistory.com)에도 8장 즈음까지 번역되어 있습니다. • Real World Haskell 위 책보다 조금 더 난이도가 있는 책입니다. 꽤 세세한 부분까지 다루며 뒷부분에는 실제 응용까지 많이 수록되어 있어 기본 문법에 어느 정도 익숙해지고 나서 보기 좋습니다. 아쉽게도 번역본은 없는 듯. 이 책도 http://book.realworldhaskell.org/read/ 에서 무료로 볼 수 있습니다.
  • 9.
    참고 자료 • 하스켈로배우는 함수형 프로그래밍 얼마 전에 제이펍에서 출간된 책입니다. 개념을 아예 모르는 상태에서 보기엔 조금 어려운 편이며 타 명령형 언어들(C++, Java 등)과의 비교를 중심으로 내용을 전개하는 서적입니다. • Hoogle, Haskell Wiki Haskell로 프로그램을 짜다 보면 수시로 들락날락거려야하는 사이트들입니다. Haskell 내부 함수들이나 Haskell에서 특정 목적의 프로그램을 짜는 법 등등의 정보가 거의 대부분 나옵니다. 사실 그냥 구글에서 관련 정보 나오면 알아서 뜨기 때문에 크게 중요하진 않지만... 그 외에도 Haskell 공식 홈페이지만 가도 유용한 튜토리얼 자료들 및 문서들이 굉장히 많습니다.