Learn You a Haskell for Great Good! 가장 쉬운 하스켈 책 | |
작가 | 미란 리포바카 |
삽화가 | 미란 리포바카 |
번역가 | 황반석 |
출판사 | No Starch Press 비제이퍼블릭 |
발매일 | 2011. 4. 2014. 2. 25. |
쪽수 | 400쪽 412쪽 |
ISBN | 9781593272838 9788994774619 |
[clearfix]
1. 개요
Learn You a Haskell for Great Good!은 미란 리포바카가 지은 하스켈 입문서이다. 부제는 "A Beginner's Guide"이다. 긴 제목을 줄여서 LYGG, LYHGG, LYAH 등으로 줄여서 쓴다. 쉬운 설명과 익살스런 삽화로 많은 사랑을 받은 책이다.2. 번역서
- 국내에 '가장 쉬운 하스켈 책: 느긋하지만, 우아하고 세련된 함수형 언어'라는 이름으로 번역서가 나왔다. 2024년 기준 절판된 상태이다.
- 알라딘 판매자 중고에 높은 가격의 매물이 올라오곤 한다.[1]
- 이 번역서에는 유명한 오타가 있다.
3. 목차
- 원서와 번역서의 목차 구성이 미묘하게 다르다.
- 아래 표는 원서의 목차이다.
Chapter 제목 1 Introduction 2 Starting Out 3 Types and Typeclasses 4 Syntax in Functions 5 Recursion 6 Higher Order Functions 7 Modules 8 Making Our Own Types and Typeclasses 9 Input and Output 10 Functionally Solving Problems 11 Functors, Applicatives Functors and Monoids 12 A Fistful of Monads 13 For a Few Monads More[2] 14 Zippers - 아래 표는 번역서의 목차이다.
Chapter 제목 1 시작하기 2 타입 3 함수의 구문 4 개념적인 개요 5 고차원 함수 6 모듈 7 타입과 타입 클래스 만들기 8 입력과 출력 9 More 입력과 출력 10 함수적으로 문제 해결하기 11 어플리커티브 펑터 12 모노이드 13 수많은 모나드 14 More 모나드 15 지퍼
4. 에러가 나는 예제
- 책이 나온지 오래돼서 책에 나온 예제를 그대로 실행할 경우 에러가 나는 코드가 몇 개 있다.
- 원서 기준 9장에서 예외 처리를 다루는 부분에 아래와 같은 코드가 나온다.
{{{import System.Environment
import System.IO.Error
main = toTry `catch` handler
toTry :: IO ()
toTry = do
(fileName:_) <- getArgs
contents <- readFile fileName
putStrLn $
contents <- readFile fileName
putStrLn $
"The file has " ++ show (length (lines contents)) ++ " lines!"
handler :: IOError -> IO ()
handler e = putStrLn "Whoops, had some trouble!"
}}}
- 위 코드를 실행할 경우 아래와 같은 에러가 발생한다.
{{{Variable not in scope: catch :: IO () -> (IOError -> IO ()) -> t
- 이때
catch
를catchIOError
로 바꾸면 에러가 나지 않는다. - 원서 기준 11장에서 타입 클래스
Monoid
와 키워드newtype
을 설명하는 곳에서 아래와 같은 코드가 나온다.
{{{newtype First a = First { getFirst :: Maybe a }
deriving (Eq, Ord, Read, Show)
instance Monoid (First a) where
mempty = First Nothing
First (Just x) `mappend` _ = First (Just x)
First Nothing `mappend` x = x
}}}First (Just x) `mappend` _ = First (Just x)
First Nothing `mappend` x = x
- 위 코드를 실행하면 아래와 같은 에러가 발생한다.
{{{No instance for (Semigroup (First a))
arising from the superclasses of an instance declaration
- 이때 아래와 같이 타입 클래스
Semigroup
의 인스턴스를 먼저 만든다.
{{{instance Semigroup (First a) where
First (Just x) <> _ = First (Just x)
First Nothing <> x = x
- 다음으로 타입 클래스
Monoid
의 인스턴스를 아래와 같이 수정한다.
{{{instance Monoid (First a) where
mempty = First Nothing
- 위와 같이 하면 더 이상 에러가 발생하지 않는다.
- 원서 기준 9장에서 랜덤을 설명하는데 나오는 함수가 표준 라이브러리에 포함되지 않아서 예제를 그대로 따라하면 에러가 난다.
{{{ghci> random (mkStdGen 100)
- 이때 GHCi에서 아래와 같이 입력하면 패키지
random
을 사용할 수 있다.
{{{ghci> :set -package random
}}}
5. 여담
- 원서 작가인 미란 리포바카의 이름은 원어로 Miran Lipovača라고 적는다. 슬로베니아에 살고 있다고 한다.[3]
- 작가가 온라인에 공개한 사이트의 저작권은 CC BY-NC-SA 3.0이다.
6. 관련 문서
7. 외부 링크
- https://learnyouahaskell.com/
- https://learnyouahaskell.github.io/
저자가 운영하는 사이트이다. 내용이 무료로 공개되어 있다. 이쪽이 원조이지만 CSS에 어떤 문제가 있는지 레이아웃이 맞지 않게 나오므로 아래 커뮤니티 버전을 보는 쪽이 좋다.
저자가 운영하는 사이트의 내용을 깃헙에 포크한 커뮤니티 버전이다. 누구나 수정 요청을 할 수 있다.