최근 수정 시각 : 2024-11-24 22:33:42

Learn You a Haskell for Great Good!

Learn You a Haskell for Great Good!
가장 쉬운 하스켈 책
파일:lyah.webp
작가 미란 리포바카
삽화가 미란 리포바카
번역가 황반석
출판사 파일:미국 국기.svg No Starch Press
파일:대한민국 국기.svg 비제이퍼블릭
발매일 파일:미국 국기.svg 2011. 4.
파일:대한민국 국기.svg 2014. 2. 25.
쪽수 파일:미국 국기.svg 400쪽
파일:대한민국 국기.svg 412쪽
ISBN 파일:미국 국기.svg 9781593272838
파일:대한민국 국기.svg 9788994774619
1. 개요2. 번역서3. 목차4. 에러가 나는 예제5. 여담6. 관련 문서7. 외부 링크

[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
import System.IO.Error

main = toTry `catch` handler

toTry :: IO ()
toTry = do
(fileName:_) <- getArgs
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
}}}
  • 이때 catchcatchIOError로 바꾸면 에러가 나지 않는다.
  • 원서 기준 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
}}}
  • 위 코드를 실행하면 아래와 같은 에러가 발생한다.
    {{{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
ghci> import System.Random
}}}

5. 여담

  • 원서 작가인 미란 리포바카의 이름은 원어로 Miran Lipovača라고 적는다. 슬로베니아에 살고 있다고 한다.[3]
  • 작가가 온라인에 공개한 사이트의 저작권은 CC BY-NC-SA 3.0이다.

6. 관련 문서

7. 외부 링크

  • https://learnyouahaskell.com/

    • 저자가 운영하는 사이트이다. 내용이 무료로 공개되어 있다. 이쪽이 원조이지만 CSS에 어떤 문제가 있는지 레이아웃이 맞지 않게 나오므로 아래 커뮤니티 버전을 보는 쪽이 좋다.
  • https://learnyouahaskell.github.io/

    • 저자가 운영하는 사이트의 내용을 깃헙에 포크한 커뮤니티 버전이다. 누구나 수정 요청을 할 수 있다.

[1] https://www.aladin.co.kr/shop/UsedShop/wuseditemall.aspx?ItemId=36960427&TabType=1[2] 이 챕터 제목은 석양의 건맨의 원제목을 패러디한 것이다.[3] https://learnyouahaskell.com/faq